1 /*! jQuery UI - v1.11.4 - 2015-03-11
2 * http://jqueryui.com
3 * Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
4 * Copyright
2015 jQuery Foundation and other contributors; Licensed MIT */
5
6 (function( factory ) {
7     
if ( typeof define === "function" && define.amd ) {
8
9         
// AMD. Register as an anonymous module.
10         define([
"jquery" ], factory );
11     }
else {
12
13         
// Browser globals
14         factory( jQuery );
15     }
16 }(function( $ ) {

17 /*!
18  * jQuery UI Core
1.11.4
19  * http://jqueryui.com
20  *
21  * Copyright jQuery Foundation and other contributors
22  * Released under the MIT license.
23  * http://jquery.org/license
24  *
25  * http://api.jqueryui.com/category/ui-core/
26  */
27
28
29 // $.ui might exist
from components with no dependencies, e.g., $.ui.position
30 $.ui = $.ui || {};
31
32 $.extend( $.ui, {
33     version:
"1.11.4",
34
35     keyCode: {
36         BACKSPACE:
8,
37         COMMA:
188,
38         DELETE:
46,
39         DOWN:
40,
40         END:
35,
41         ENTER:
13,
42         ESCAPE:
27,
43         HOME:
36,
44         LEFT:
37,
45         PAGE_DOWN:
34,
46         PAGE_UP:
33,
47         PERIOD:
190,
48         RIGHT:
39,
49         SPACE:
32,
50         TAB:
9,
51         UP:
38
52     }
53 });

54
55 // plugins

56 $.fn.extend({
57     scrollParent: function( includeHidden ) {
58         
var position = this.css( "position" ),
59             excludeStaticParent = position ===
"absolute",
60             overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
61             scrollParent =
this.parents().filter( function() {
62                 
var parent = $( this );
63                 
if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
64                     
return false;
65                 }
66                 
return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
67             }).eq(
0 );
68
69         
return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
70     },
71
72     uniqueId: (function() {
73         
var uuid = 0;
74
75         
return function() {
76             
return this.each(function() {
77                 
if ( !this.id ) {
78                     
this.id = "ui-id-" + ( ++uuid );
79                 }
80             });
81         };
82     })(),
83
84     removeUniqueId: function() {
85         
return this.each(function() {
86             
if ( /^ui-id-\d+$/.test( this.id ) ) {
87                 $(
this ).removeAttr( "id" );
88             }
89         });
90     }
91 });

92
93 // selectors

94 function focusable( element, isTabIndexNotNaN ) {
95     
var map, mapName, img,
96         nodeName = element.nodeName.toLowerCase();
97     
if ( "area" === nodeName ) {
98         map = element.parentNode;
99         mapName = map.name;
100         
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
101             
return false;
102         }
103         img = $(
"img[usemap='#" + mapName + "']" )[ 0 ];
104         
return !!img && visible( img );
105     }
106     
return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
107         !element.disabled :
108         
"a" === nodeName ?
109             element.href || isTabIndexNotNaN :
110             isTabIndexNotNaN) &&
111         
// the element and all of its ancestors must be visible
112         visible( element );
113 }
114
115 function visible( element ) {
116     
return $.expr.filters.visible( element ) &&
117         !$( element ).parents().addBack().filter(function() {
118             
return $.css( this, "visibility" ) === "hidden";
119         }).length;
120 }
121
122 $.extend( $.expr[
":" ], {
123     data: $.expr.createPseudo ?
124         $.expr.createPseudo(function( dataName ) {
125             
return function( elem ) {
126                 
return !!$.data( elem, dataName );
127             };
128         }) :
129         
// support: jQuery <1.8
130         function( elem, i, match ) {
131             
return !!$.data( elem, match[ 3 ] );
132         },
133
134     focusable: function( element ) {
135         
return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
136     },
137
138     tabbable: function( element ) {
139         
var tabIndex = $.attr( element, "tabindex" ),
140             isTabIndexNaN = isNaN( tabIndex );
141         
return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
142     }
143 });

144
145 // support: jQuery <
1.8
146 if
( !$( "<a>" ).outerWidth( 1 ).jquery ) {
147     $.each( [
"Width", "Height" ], function( i, name ) {
148         
var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
149             type = name.toLowerCase(),
150             orig = {
151                 innerWidth: $.fn.innerWidth,
152                 innerHeight: $.fn.innerHeight,
153                 outerWidth: $.fn.outerWidth,
154                 outerHeight: $.fn.outerHeight
155             };
156
157         function reduce( elem, size, border, margin ) {
158             $.each( side, function() {
159                 size -= parseFloat( $.css( elem,
"padding" + this ) ) || 0;
160                 
if ( border ) {
161                     size -= parseFloat( $.css( elem,
"border" + this + "Width" ) ) || 0;
162                 }
163                 
if ( margin ) {
164                     size -= parseFloat( $.css( elem,
"margin" + this ) ) || 0;
165                 }
166             });
167             
return size;
168         }
169
170         $.fn[
"inner" + name ] = function( size ) {
171             
if ( size === undefined ) {
172                 
return orig[ "inner" + name ].call( this );
173             }
174
175             
return this.each(function() {
176                 $(
this ).css( type, reduce( this, size ) + "px" );
177             });
178         };
179
180         $.fn[
"outer" + name] = function( size, margin ) {
181             
if ( typeof size !== "number" ) {
182                 
return orig[ "outer" + name ].call( this, size );
183             }
184
185             
return this.each(function() {
186                 $(
this).css( type, reduce( this, size, true, margin ) + "px" );
187             });
188         };
189     });
190 }

191
192 // support: jQuery <
1.8
193 if
( !$.fn.addBack ) {
194     $.fn.addBack = function( selector ) {
195         
return this.add( selector == null ?
196             
this.prevObject : this.prevObject.filter( selector )
197         );
198     };
199 }

200
201 // support: jQuery
1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
202 if
( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
203     $.fn.removeData = (function( removeData ) {
204         
return function( key ) {
205             
if ( arguments.length ) {
206                 
return removeData.call( this, $.camelCase( key ) );
207             }
else {
208                 
return removeData.call( this );
209             }
210         };
211     })( $.fn.removeData );
212 }

213
214 // deprecated

215 $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
216
217 $.fn.extend({
218     focus: (function( orig ) {
219         
return function( delay, fn ) {
220             
return typeof delay === "number" ?
221                 
this.each(function() {
222                     
var elem = this;
223                     setTimeout(function() {
224                         $( elem ).focus();
225                         
if ( fn ) {
226                             fn.call( elem );
227                         }
228                     }, delay );
229                 }) :
230                 orig.apply(
this, arguments );
231         };
232     })( $.fn.focus ),
233
234     disableSelection: (function() {
235         
var eventType = "onselectstart" in document.createElement( "div" ) ?
236             
"selectstart" :
237             
"mousedown";
238
239         
return function() {
240             
return this.bind( eventType + ".ui-disableSelection", function( event ) {
241                 
event.preventDefault();
242             });
243         };
244     })(),
245
246     enableSelection: function() {
247         
return this.unbind( ".ui-disableSelection" );
248     },
249
250     zIndex: function( zIndex ) {
251         
if ( zIndex !== undefined ) {
252             
return this.css( "zIndex", zIndex );
253         }
254
255         
if ( this.length ) {
256             
var elem = $( this[ 0 ] ), position, value;
257             
while ( elem.length && elem[ 0 ] !== document ) {
258                 
// Ignore z-index if position is set to a value where z-index is ignored by the browser
259                 
// This makes behavior of this function consistent across browsers
260                 
// WebKit always returns auto if the element is positioned
261                 position = elem.css(
"position" );
262                 
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
263                     
// IE returns 0 when zIndex is not specified
264                     
// other browsers return a string
265                     
// we ignore the case of nested elements with an explicit value of 0
266                     
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
267                     
value = parseInt( elem.css( "zIndex" ), 10 );
268                     
if ( !isNaN( value ) && value !== 0 ) {
269                         
return value;
270                     }
271                 }
272                 elem = elem.parent();
273             }
274         }
275
276         
return 0;
277     }
278 });

279
280 // $.ui.plugin
is deprecated. Use $.widget() extensions instead.
281 $.ui.plugin = {
282     
add: function( module, option, set ) {
283         
var i,
284             proto = $.ui[ module ].prototype;
285         
for ( i in set ) {
286             proto.plugins[ i ] = proto.plugins[ i ] || [];
287             proto.plugins[ i ].push( [ option,
set[ i ] ] );
288         }
289     },
290     call: function( instance, name, args, allowDisconnected ) {
291         
var i,
292             
set = instance.plugins[ name ];
293
294         
if ( !set ) {
295             
return;
296         }
297
298         
if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
299             
return;
300         }
301
302         
for ( i = 0; i < set.length; i++ ) {
303             
if ( instance.options[ set[ i ][ 0 ] ] ) {
304                 
set[ i ][ 1 ].apply( instance.element, args );
305             }
306         }
307     }
308 };

309
310
311 /*!
312  * jQuery UI Widget
1.11.4
313  * http://jqueryui.com
314  *
315  * Copyright jQuery Foundation and other contributors
316  * Released under the MIT license.
317  * http://jquery.org/license
318  *
319  * http://api.jqueryui.com/jQuery.widget/
320  */

321
322
323 var
widget_uuid = 0,
324     widget_slice = Array.prototype.slice;
325
326 $.cleanData = (function( orig ) {
327     
return function( elems ) {
328         
var events, elem, i;
329         
for ( i = 0; (elem = elems[i]) != null; i++ ) {
330             
try {
331
332                 
// Only trigger remove when necessary to save time
333                 events = $._data( elem,
"events" );
334                 
if ( events && events.remove ) {
335                     $( elem ).triggerHandler(
"remove" );
336                 }
337
338             
// http://bugs.jquery.com/ticket/8235
339             }
catch ( e ) {}
340         }
341         orig( elems );
342     };
343 })( $.cleanData );
344
345 $.widget = function( name,
base, prototype ) {
346     
var fullName, existingConstructor, constructor, basePrototype,
347         
// proxiedPrototype allows the provided prototype to remain unmodified
348         
// so that it can be used as a mixin for multiple widgets (#8876)
349         proxiedPrototype = {},
350         
namespace = name.split( "." )[ 0 ];
351
352     name = name.split(
"." )[ 1 ];
353     fullName =
namespace + "-" + name;
354
355     
if ( !prototype ) {
356         prototype =
base;
357         
base = $.Widget;
358     }
359
360     
// create selector for plugin
361     $.expr[
":" ][ fullName.toLowerCase() ] = function( elem ) {
362         
return !!$.data( elem, fullName );
363     };
364
365     $[
namespace ] = $[ namespace ] || {};
366     existingConstructor = $[
namespace ][ name ];
367     constructor = $[
namespace ][ name ] = function( options, element ) {
368         
// allow instantiation without "new" keyword
369         
if ( !this._createWidget ) {
370             
return new constructor( options, element );
371         }
372
373         
// allow instantiation without initializing for simple inheritance
374         
// must use "new" keyword (the code above always passes args)
375         
if ( arguments.length ) {
376             
this._createWidget( options, element );
377         }
378     };
379     
// extend with the existing constructor to carry over any static properties
380     $.extend( constructor, existingConstructor, {
381         version: prototype.version,
382         
// copy the object used to create the prototype in case we need to
383         
// redefine the widget later
384         _proto: $.extend( {}, prototype ),
385         
// track widgets that inherit from this widget in case this widget is
386         
// redefined after a widget inherits from it
387         _childConstructors: []
388     });
389
390     basePrototype =
new base();
391     
// we need to make the options hash a property directly on the new instance
392     
// otherwise we'll modify the options hash on the prototype that we're
393     
// inheriting from
394     basePrototype.options = $.widget.extend( {}, basePrototype.options );
395     $.each( prototype, function( prop,
value ) {
396         
if ( !$.isFunction( value ) ) {
397             proxiedPrototype[ prop ] =
value;
398             
return;
399         }
400         proxiedPrototype[ prop ] = (function() {
401             
var _super = function() {
402                     
return base.prototype[ prop ].apply( this, arguments );
403                 },
404                 _superApply = function( args ) {
405                     
return base.prototype[ prop ].apply( this, args );
406                 };
407             
return function() {
408                 
var __super = this._super,
409                     __superApply =
this._superApply,
410                     returnValue;
411
412                 
this._super = _super;
413                 
this._superApply = _superApply;
414
415                 returnValue =
value.apply( this, arguments );
416
417                 
this._super = __super;
418                 
this._superApply = __superApply;
419
420                 
return returnValue;
421             };
422         })();
423     });
424     constructor.prototype = $.widget.extend( basePrototype, {
425         
// TODO: remove support for widgetEventPrefix
426         
// always use the name + a colon as the prefix, e.g., draggable:start
427         
// don't prefix for widgets that aren't DOM-based
428         widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
429     }, proxiedPrototype, {
430         constructor: constructor,
431         
namespace: namespace,
432         widgetName: name,
433         widgetFullName: fullName
434     });
435
436     
// If this widget is being redefined then we need to find all widgets that
437     
// are inheriting from it and redefine all of them so that they inherit from
438     
// the new version of this widget. We're essentially trying to replace one
439     
// level in the prototype chain.
440     
if ( existingConstructor ) {
441         $.each( existingConstructor._childConstructors, function( i, child ) {
442             
var childPrototype = child.prototype;
443
444             
// redefine the child widget using the same prototype that was
445             
// originally used, but inherit from the new version of the base
446             $.widget( childPrototype.
namespace + "." + childPrototype.widgetName, constructor, child._proto );
447         });
448         
// remove the list of existing child constructors from the old constructor
449         
// so the old child constructors can be garbage collected
450         delete existingConstructor._childConstructors;
451     }
else {
452         
base._childConstructors.push( constructor );
453     }
454
455     $.widget.bridge( name, constructor );
456
457     
return constructor;
458 };
459
460 $.widget.extend = function( target ) {
461     
var input = widget_slice.call( arguments, 1 ),
462         inputIndex =
0,
463         inputLength = input.length,
464         key,
465         
value;
466     
for ( ; inputIndex < inputLength; inputIndex++ ) {
467         
for ( key in input[ inputIndex ] ) {
468             
value = input[ inputIndex ][ key ];
469             
if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
470                 
// Clone objects
471                 
if ( $.isPlainObject( value ) ) {
472                     target[ key ] = $.isPlainObject( target[ key ] ) ?
473                         $.widget.extend( {}, target[ key ],
value ) :
474                         
// Don't extend strings, arrays, etc. with objects
475                         $.widget.extend( {},
value );
476                 
// Copy everything else by reference
477                 }
else {
478                     target[ key ] =
value;
479                 }
480             }
481         }
482     }
483     
return target;
484 };
485
486 $.widget.bridge = function( name,
object ) {
487     
var fullName = object.prototype.widgetFullName || name;
488     $.fn[ name ] = function( options ) {
489         
var isMethodCall = typeof options === "string",
490             args = widget_slice.call( arguments,
1 ),
491             returnValue =
this;
492
493         
if ( isMethodCall ) {
494             
this.each(function() {
495                 
var methodValue,
496                     instance = $.data(
this, fullName );
497                 
if ( options === "instance" ) {
498                     returnValue = instance;
499                     
return false;
500                 }
501                 
if ( !instance ) {
502                     
return $.error( "cannot call methods on " + name + " prior to initialization; " +
503                         
"attempted to call method '" + options + "'" );
504                 }
505                 
if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
506                     
return $.error( "no such method '" + options + "' for " + name + " widget instance" );
507                 }
508                 methodValue = instance[ options ].apply( instance, args );
509                 
if ( methodValue !== instance && methodValue !== undefined ) {
510                     returnValue = methodValue && methodValue.jquery ?
511                         returnValue.pushStack( methodValue.
get() ) :
512                         methodValue;
513                     
return false;
514                 }
515             });
516         }
else {
517
518             
// Allow multiple hashes to be passed on init
519             
if ( args.length ) {
520                 options = $.widget.extend.apply(
null, [ options ].concat(args) );
521             }
522
523             
this.each(function() {
524                 
var instance = $.data( this, fullName );
525                 
if ( instance ) {
526                     instance.option( options || {} );
527                     
if ( instance._init ) {
528                         instance._init();
529                     }
530                 }
else {
531                     $.data(
this, fullName, new object( options, this ) );
532                 }
533             });
534         }
535
536         
return returnValue;
537     };
538 };
539
540 $.Widget = function(
/* options, element */ ) {};
541 $.Widget._childConstructors = [];
542
543 $.Widget.prototype = {
544     widgetName:
"widget",
545     widgetEventPrefix:
"",
546     defaultElement:
"<div>",
547     options: {
548         disabled:
false,
549
550         
// callbacks
551         create:
null
552     },
553     _createWidget: function( options, element ) {
554         element = $( element ||
this.defaultElement || this )[ 0 ];
555         
this.element = $( element );
556         
this.uuid = widget_uuid++;
557         
this.eventNamespace = "." + this.widgetName + this.uuid;
558
559         
this.bindings = $();
560         
this.hoverable = $();
561         
this.focusable = $();
562
563         
if ( element !== this ) {
564             $.data( element,
this.widgetFullName, this );
565             
this._on( true, this.element, {
566                 
remove: function( event ) {
567                     
if ( event.target === element ) {
568                         
this.destroy();
569                     }
570                 }
571             });
572             
this.document = $( element.style ?
573                 
// element within the document
574                 element.ownerDocument :
575                 
// element is window or document
576                 element.document || element );
577             
this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
578         }
579
580         
this.options = $.widget.extend( {},
581             
this.options,
582             
this._getCreateOptions(),
583             options );
584
585         
this._create();
586         
this._trigger( "create", null, this._getCreateEventData() );
587         
this._init();
588     },
589     _getCreateOptions: $.noop,
590     _getCreateEventData: $.noop,
591     _create: $.noop,
592     _init: $.noop,
593
594     destroy: function() {
595         
this._destroy();
596         
// we can probably remove the unbind calls in 2.0
597         
// all event bindings should go through this._on()
598         
this.element
599             .unbind(
this.eventNamespace )
600             .removeData(
this.widgetFullName )
601             
// support: jquery <1.6.3
602             
// http://bugs.jquery.com/ticket/9413
603             .removeData( $.camelCase(
this.widgetFullName ) );
604         
this.widget()
605             .unbind(
this.eventNamespace )
606             .removeAttr(
"aria-disabled" )
607             .removeClass(
608                 
this.widgetFullName + "-disabled " +
609                 
"ui-state-disabled" );
610
611         
// clean up events and states
612         
this.bindings.unbind( this.eventNamespace );
613         
this.hoverable.removeClass( "ui-state-hover" );
614         
this.focusable.removeClass( "ui-state-focus" );
615     },
616     _destroy: $.noop,
617
618     widget: function() {
619         
return this.element;
620     },
621
622     option: function( key,
value ) {
623         
var options = key,
624             parts,
625             curOption,
626             i;
627
628         
if ( arguments.length === 0 ) {
629             
// don't return a reference to the internal hash
630             
return $.widget.extend( {}, this.options );
631         }
632
633         
if ( typeof key === "string" ) {
634             
// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
635             options = {};
636             parts = key.split(
"." );
637             key = parts.shift();
638             
if ( parts.length ) {
639                 curOption = options[ key ] = $.widget.extend( {},
this.options[ key ] );
640                 
for ( i = 0; i < parts.length - 1; i++ ) {
641                     curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
642                     curOption = curOption[ parts[ i ] ];
643                 }
644                 key = parts.pop();
645                 
if ( arguments.length === 1 ) {
646                     
return curOption[ key ] === undefined ? null : curOption[ key ];
647                 }
648                 curOption[ key ] =
value;
649             }
else {
650                 
if ( arguments.length === 1 ) {
651                     
return this.options[ key ] === undefined ? null : this.options[ key ];
652                 }
653                 options[ key ] =
value;
654             }
655         }
656
657         
this._setOptions( options );
658
659         
return this;
660     },
661     _setOptions: function( options ) {
662         
var key;
663
664         
for ( key in options ) {
665             
this._setOption( key, options[ key ] );
666         }
667
668         
return this;
669     },
670     _setOption: function( key,
value ) {
671         
this.options[ key ] = value;
672
673         
if ( key === "disabled" ) {
674             
this.widget()
675                 .toggleClass(
this.widgetFullName + "-disabled", !!value );
676
677             
// If the widget is becoming disabled, then nothing is interactive
678             
if ( value ) {
679                 
this.hoverable.removeClass( "ui-state-hover" );
680                 
this.focusable.removeClass( "ui-state-focus" );
681             }
682         }
683
684         
return this;
685     },
686
687     enable: function() {
688         
return this._setOptions({ disabled: false });
689     },
690     disable: function() {
691         
return this._setOptions({ disabled: true });
692     },
693
694     _on: function( suppressDisabledCheck, element, handlers ) {
695         
var delegateElement,
696             instance =
this;
697
698         
// no suppressDisabledCheck flag, shuffle arguments
699         
if ( typeof suppressDisabledCheck !== "boolean" ) {
700             handlers = element;
701             element = suppressDisabledCheck;
702             suppressDisabledCheck =
false;
703         }
704
705         
// no element argument, shuffle and use this.element
706         
if ( !handlers ) {
707             handlers = element;
708             element =
this.element;
709             delegateElement =
this.widget();
710         }
else {
711             element = delegateElement = $( element );
712             
this.bindings = this.bindings.add( element );
713         }
714
715         $.each( handlers, function(
event, handler ) {
716             function handlerProxy() {
717                 
// allow widgets to customize the disabled handling
718                 
// - disabled as an array instead of boolean
719                 
// - disabled class as method for disabling individual parts
720                 
if ( !suppressDisabledCheck &&
721                         ( instance.options.disabled ===
true ||
722                             $(
this ).hasClass( "ui-state-disabled" ) ) ) {
723                     
return;
724                 }
725                 
return ( typeof handler === "string" ? instance[ handler ] : handler )
726                     .apply( instance, arguments );
727             }
728
729             
// copy the guid so direct unbinding works
730             
if ( typeof handler !== "string" ) {
731                 handlerProxy.guid = handler.guid =
732                     handler.guid || handlerProxy.guid || $.guid++;
733             }
734
735             
var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
736                 eventName = match[
1] + instance.eventNamespace,
737                 selector = match[
2];
738             
if ( selector ) {
739                 delegateElement.
delegate( selector, eventName, handlerProxy );
740             }
else {
741                 element.bind( eventName, handlerProxy );
742             }
743         });
744     },
745
746     _off: function( element, eventName ) {
747         eventName = (eventName ||
"").split( " " ).join( this.eventNamespace + " " ) +
748             
this.eventNamespace;
749         element.unbind( eventName ).undelegate( eventName );
750
751         
// Clear the stack to avoid memory leaks (#10056)
752         
this.bindings = $( this.bindings.not( element ).get() );
753         
this.focusable = $( this.focusable.not( element ).get() );
754         
this.hoverable = $( this.hoverable.not( element ).get() );
755     },
756
757     _delay: function( handler, delay ) {
758         function handlerProxy() {
759             
return ( typeof handler === "string" ? instance[ handler ] : handler )
760                 .apply( instance, arguments );
761         }
762         
var instance = this;
763         
return setTimeout( handlerProxy, delay || 0 );
764     },
765
766     _hoverable: function( element ) {
767         
this.hoverable = this.hoverable.add( element );
768         
this._on( element, {
769             mouseenter: function(
event ) {
770                 $(
event.currentTarget ).addClass( "ui-state-hover" );
771             },
772             mouseleave: function(
event ) {
773                 $(
event.currentTarget ).removeClass( "ui-state-hover" );
774             }
775         });
776     },
777
778     _focusable: function( element ) {
779         
this.focusable = this.focusable.add( element );
780         
this._on( element, {
781             focusin: function(
event ) {
782                 $(
event.currentTarget ).addClass( "ui-state-focus" );
783             },
784             focusout: function(
event ) {
785                 $(
event.currentTarget ).removeClass( "ui-state-focus" );
786             }
787         });
788     },
789
790     _trigger: function( type,
event, data ) {
791         
var prop, orig,
792             callback =
this.options[ type ];
793
794         data = data || {};
795         
event = $.Event( event );
796         
event.type = ( type === this.widgetEventPrefix ?
797             type :
798             
this.widgetEventPrefix + type ).toLowerCase();
799         
// the original event may come from any element
800         
// so we need to reset the target on the new event
801         
event.target = this.element[ 0 ];
802
803         
// copy original event properties over to the new event
804         orig =
event.originalEvent;
805         
if ( orig ) {
806             
for ( prop in orig ) {
807                 
if ( !( prop in event ) ) {
808                     
event[ prop ] = orig[ prop ];
809                 }
810             }
811         }
812
813         
this.element.trigger( event, data );
814         
return !( $.isFunction( callback ) &&
815             callback.apply(
this.element[0], [ event ].concat( data ) ) === false ||
816             
event.isDefaultPrevented() );
817     }
818 };
819
820 $.each( { show:
"fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
821     $.Widget.prototype[
"_" + method ] = function( element, options, callback ) {
822         
if ( typeof options === "string" ) {
823             options = { effect: options };
824         }
825         
var hasOptions,
826             effectName = !options ?
827                 method :
828                 options ===
true || typeof options === "number" ?
829                     defaultEffect :
830                     options.effect || defaultEffect;
831         options = options || {};
832         
if ( typeof options === "number" ) {
833             options = { duration: options };
834         }
835         hasOptions = !$.isEmptyObject( options );
836         options.complete = callback;
837         
if ( options.delay ) {
838             element.delay( options.delay );
839         }
840         
if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
841             element[ method ]( options );
842         }
else if ( effectName !== method && element[ effectName ] ) {
843             element[ effectName ]( options.duration, options.easing, callback );
844         }
else {
845             element.queue(function( next ) {
846                 $(
this )[ method ]();
847                 
if ( callback ) {
848                     callback.call( element[
0 ] );
849                 }
850                 next();
851             });
852         }
853     };
854 });

855
856 var
widget = $.widget;
857
858
859 /*!
860  * jQuery UI Mouse
1.11.4
861  * http://jqueryui.com
862  *
863  * Copyright jQuery Foundation and other contributors
864  * Released under the MIT license.
865  * http://jquery.org/license
866  *
867  * http://api.jqueryui.com/mouse/
868  */

869
870
871 var
mouseHandled = false;
872 $( document ).mouseup( function() {
873     mouseHandled =
false;
874 });

875
876 var
mouse = $.widget("ui.mouse", {
877     version:
"1.11.4",
878     options: {
879         cancel:
"input,textarea,button,select,option",
880         distance:
1,
881         delay:
0
882     },
883     _mouseInit: function() {
884         
var that = this;
885
886         
this.element
887             .bind(
"mousedown." + this.widgetName, function(event) {
888                 
return that._mouseDown(event);
889             })
890             .bind(
"click." + this.widgetName, function(event) {
891                 
if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
892                     $.removeData(
event.target, that.widgetName + ".preventClickEvent");
893                     
event.stopImmediatePropagation();
894                     
return false;
895                 }
896             });
897
898         
this.started = false;
899     },
900
901     
// TODO: make sure destroying one instance of mouse doesn't mess with
902     
// other instances of mouse
903     _mouseDestroy: function() {
904         
this.element.unbind("." + this.widgetName);
905         
if ( this._mouseMoveDelegate ) {
906             
this.document
907                 .unbind(
"mousemove." + this.widgetName, this._mouseMoveDelegate)
908                 .unbind(
"mouseup." + this.widgetName, this._mouseUpDelegate);
909         }
910     },
911
912     _mouseDown: function(
event) {
913         
// don't let more than one widget handle mouseStart
914         
if ( mouseHandled ) {
915             
return;
916         }
917
918         
this._mouseMoved = false;
919
920         
// we may have missed mouseup (out of window)
921         (
this._mouseStarted && this._mouseUp(event));
922
923         
this._mouseDownEvent = event;
924
925         
var that = this,
926             btnIsLeft = (
event.which === 1),
927             
// event.target.nodeName works around a bug in IE 8 with
928             
// disabled inputs (#7620)
929             elIsCancel = (
typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
930         
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
931             
return true;
932         }
933
934         
this.mouseDelayMet = !this.options.delay;
935         
if (!this.mouseDelayMet) {
936             
this._mouseDelayTimer = setTimeout(function() {
937                 that.mouseDelayMet =
true;
938             },
this.options.delay);
939         }
940
941         
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
942             
this._mouseStarted = (this._mouseStart(event) !== false);
943             
if (!this._mouseStarted) {
944                 
event.preventDefault();
945                 
return true;
946             }
947         }
948
949         
// Click event may never have fired (Gecko & Opera)
950         
if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
951             $.removeData(
event.target, this.widgetName + ".preventClickEvent");
952         }
953
954         
// these delegates are required to keep context
955         
this._mouseMoveDelegate = function(event) {
956             
return that._mouseMove(event);
957         };
958         
this._mouseUpDelegate = function(event) {
959             
return that._mouseUp(event);
960         };
961
962         
this.document
963             .bind(
"mousemove." + this.widgetName, this._mouseMoveDelegate )
964             .bind(
"mouseup." + this.widgetName, this._mouseUpDelegate );
965
966         
event.preventDefault();
967
968         mouseHandled =
true;
969         
return true;
970     },
971
972     _mouseMove: function(
event) {
973         
// Only check for mouseups outside the document if you've moved inside the document
974         
// at least once. This prevents the firing of mouseup in the case of IE<9, which will
975         
// fire a mousemove event if content is placed under the cursor. See #7778
976         
// Support: IE <9
977         
if ( this._mouseMoved ) {
978             
// IE mouseup check - mouseup happened when mouse was out of window
979             
if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
980                 
return this._mouseUp(event);
981
982             
// Iframe mouseup check - mouseup occurred in another document
983             }
else if ( !event.which ) {
984                 
return this._mouseUp( event );
985             }
986         }
987
988         
if ( event.which || event.button ) {
989             
this._mouseMoved = true;
990         }
991
992         
if (this._mouseStarted) {
993             
this._mouseDrag(event);
994             
return event.preventDefault();
995         }
996
997         
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
998             
this._mouseStarted =
999                 (
this._mouseStart(this._mouseDownEvent, event) !== false);
1000             (
this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
1001         }
1002
1003         
return !this._mouseStarted;
1004     },
1005
1006     _mouseUp: function(
event) {
1007         
this.document
1008             .unbind(
"mousemove." + this.widgetName, this._mouseMoveDelegate )
1009             .unbind(
"mouseup." + this.widgetName, this._mouseUpDelegate );
1010
1011         
if (this._mouseStarted) {
1012             
this._mouseStarted = false;
1013
1014             
if (event.target === this._mouseDownEvent.target) {
1015                 $.data(
event.target, this.widgetName + ".preventClickEvent", true);
1016             }
1017
1018             
this._mouseStop(event);
1019         }
1020
1021         mouseHandled =
false;
1022         
return false;
1023     },
1024
1025     _mouseDistanceMet: function(
event) {
1026         
return (Math.max(
1027                 Math.abs(
this._mouseDownEvent.pageX - event.pageX),
1028                 Math.abs(
this._mouseDownEvent.pageY - event.pageY)
1029             ) >=
this.options.distance
1030         );
1031     },
1032
1033     _mouseDelayMet: function(
/* event */) {
1034         
return this.mouseDelayMet;
1035     },
1036
1037     
// These are placeholder methods, to be overriden by extending plugin
1038     _mouseStart: function(
/* event */) {},
1039     _mouseDrag: function(
/* event */) {},
1040     _mouseStop: function(
/* event */) {},
1041     _mouseCapture: function(
/* event */) { return true; }
1042 });

1043
1044
1045 /*!
1046  * jQuery UI Position
1.11.4
1047  * http://jqueryui.com
1048  *
1049  * Copyright jQuery Foundation and other contributors
1050  * Released under the MIT license.
1051  * http://jquery.org/license
1052  *
1053  * http://api.jqueryui.com/position/
1054  */

1055
1056 (function() {
1057
1058 $.ui = $.ui || {};

1059
1060 var
cachedScrollbarWidth, supportsOffsetFractions,
1061     max = Math.max,
1062     abs = Math.abs,
1063     round = Math.round,
1064     rhorizontal = /left|center|right/,
1065     rvertical = /top|center|bottom/,
1066     roffset = /[\+\-]\d+(\.[\d]+)?%?/,
1067     rposition = /^\w+/,
1068     rpercent = /%$/,
1069     _position = $.fn.position;
1070
1071 function getOffsets( offsets, width, height ) {
1072     
return [
1073         parseFloat( offsets[
0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
1074         parseFloat( offsets[
1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
1075     ];
1076 }
1077
1078 function parseCss( element, property ) {
1079     
return parseInt( $.css( element, property ), 10 ) || 0;
1080 }
1081
1082 function getDimensions( elem ) {
1083     
var raw = elem[0];
1084     
if ( raw.nodeType === 9 ) {
1085         
return {
1086             width: elem.width(),
1087             height: elem.height(),
1088             offset: { top:
0, left: 0 }
1089         };
1090     }
1091     
if ( $.isWindow( raw ) ) {
1092         
return {
1093             width: elem.width(),
1094             height: elem.height(),
1095             offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
1096         };
1097     }
1098     
if ( raw.preventDefault ) {
1099         
return {
1100             width:
0,
1101             height:
0,
1102             offset: { top: raw.pageY, left: raw.pageX }
1103         };
1104     }
1105     
return {
1106         width: elem.outerWidth(),
1107         height: elem.outerHeight(),
1108         offset: elem.offset()
1109     };
1110 }
1111
1112 $.position = {
1113     scrollbarWidth: function() {
1114         
if ( cachedScrollbarWidth !== undefined ) {
1115             
return cachedScrollbarWidth;
1116         }
1117         
var w1, w2,
1118             div = $(
"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
1119             innerDiv = div.children()[
0];
1120
1121         $(
"body" ).append( div );
1122         w1 = innerDiv.offsetWidth;
1123         div.css(
"overflow", "scroll" );
1124
1125         w2 = innerDiv.offsetWidth;
1126
1127         
if ( w1 === w2 ) {
1128             w2 = div[
0].clientWidth;
1129         }
1130
1131         div.
remove();
1132
1133         
return (cachedScrollbarWidth = w1 - w2);
1134     },
1135     getScrollInfo: function( within ) {
1136         
var overflowX = within.isWindow || within.isDocument ? "" :
1137                 within.element.css(
"overflow-x" ),
1138             overflowY = within.isWindow || within.isDocument ?
"" :
1139                 within.element.css(
"overflow-y" ),
1140             hasOverflowX = overflowX ===
"scroll" ||
1141                 ( overflowX ===
"auto" && within.width < within.element[0].scrollWidth ),
1142             hasOverflowY = overflowY ===
"scroll" ||
1143                 ( overflowY ===
"auto" && within.height < within.element[0].scrollHeight );
1144         
return {
1145             width: hasOverflowY ? $.position.scrollbarWidth() :
0,
1146             height: hasOverflowX ? $.position.scrollbarWidth() :
0
1147         };
1148     },
1149     getWithinInfo: function( element ) {
1150         
var withinElement = $( element || window ),
1151             isWindow = $.isWindow( withinElement[
0] ),
1152             isDocument = !!withinElement[
0 ] && withinElement[ 0 ].nodeType === 9;
1153         
return {
1154             element: withinElement,
1155             isWindow: isWindow,
1156             isDocument: isDocument,
1157             offset: withinElement.offset() || { left:
0, top: 0 },
1158             scrollLeft: withinElement.scrollLeft(),
1159             scrollTop: withinElement.scrollTop(),
1160
1161             
// support: jQuery 1.6.x
1162             
// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
1163             width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
1164             height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
1165         };
1166     }
1167 };
1168
1169 $.fn.position = function( options ) {
1170     
if ( !options || !options.of ) {
1171         
return _position.apply( this, arguments );
1172     }
1173
1174     
// make a copy, we don't want to modify arguments
1175     options = $.extend( {}, options );
1176
1177     
var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
1178         target = $( options.of ),
1179         within = $.position.getWithinInfo( options.within ),
1180         scrollInfo = $.position.getScrollInfo( within ),
1181         collision = ( options.collision ||
"flip" ).split( " " ),
1182         offsets = {};
1183
1184     dimensions = getDimensions( target );
1185     
if ( target[0].preventDefault ) {
1186         
// force left top to allow flipping
1187         options.at =
"left top";
1188     }
1189     targetWidth = dimensions.width;
1190     targetHeight = dimensions.height;
1191     targetOffset = dimensions.offset;
1192     
// clone to reuse original targetOffset later
1193     basePosition = $.extend( {}, targetOffset );
1194
1195     
// force my and at to have valid horizontal and vertical positions
1196     
// if a value is missing or invalid, it will be converted to center
1197     $.each( [
"my", "at" ], function() {
1198         
var pos = ( options[ this ] || "" ).split( " " ),
1199             horizontalOffset,
1200             verticalOffset;
1201
1202         
if ( pos.length === 1) {
1203             pos = rhorizontal.test( pos[
0 ] ) ?
1204                 pos.concat( [
"center" ] ) :
1205                 rvertical.test( pos[
0 ] ) ?
1206                     [
"center" ].concat( pos ) :
1207                     [
"center", "center" ];
1208         }
1209         pos[
0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
1210         pos[
1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
1211
1212         
// calculate offsets
1213         horizontalOffset = roffset.exec( pos[
0 ] );
1214         verticalOffset = roffset.exec( pos[
1 ] );
1215         offsets[
this ] = [
1216             horizontalOffset ? horizontalOffset[
0 ] : 0,
1217             verticalOffset ? verticalOffset[
0 ] : 0
1218         ];
1219
1220         
// reduce to just the positions without the offsets
1221         options[
this ] = [
1222             rposition.exec( pos[
0 ] )[ 0 ],
1223             rposition.exec( pos[
1 ] )[ 0 ]
1224         ];
1225     });
1226
1227     
// normalize collision option
1228     
if ( collision.length === 1 ) {
1229         collision[
1 ] = collision[ 0 ];
1230     }
1231
1232     
if ( options.at[ 0 ] === "right" ) {
1233         basePosition.left += targetWidth;
1234     }
else if ( options.at[ 0 ] === "center" ) {
1235         basePosition.left += targetWidth /
2;
1236     }
1237
1238     
if ( options.at[ 1 ] === "bottom" ) {
1239         basePosition.top += targetHeight;
1240     }
else if ( options.at[ 1 ] === "center" ) {
1241         basePosition.top += targetHeight /
2;
1242     }
1243
1244     atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
1245     basePosition.left += atOffset[
0 ];
1246     basePosition.top += atOffset[
1 ];
1247
1248     
return this.each(function() {
1249         
var collisionPosition, using,
1250             elem = $(
this ),
1251             elemWidth = elem.outerWidth(),
1252             elemHeight = elem.outerHeight(),
1253             marginLeft = parseCss(
this, "marginLeft" ),
1254             marginTop = parseCss(
this, "marginTop" ),
1255             collisionWidth = elemWidth + marginLeft + parseCss(
this, "marginRight" ) + scrollInfo.width,
1256             collisionHeight = elemHeight + marginTop + parseCss(
this, "marginBottom" ) + scrollInfo.height,
1257             position = $.extend( {}, basePosition ),
1258             myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
1259
1260         
if ( options.my[ 0 ] === "right" ) {
1261             position.left -= elemWidth;
1262         }
else if ( options.my[ 0 ] === "center" ) {
1263             position.left -= elemWidth /
2;
1264         }
1265
1266         
if ( options.my[ 1 ] === "bottom" ) {
1267             position.top -= elemHeight;
1268         }
else if ( options.my[ 1 ] === "center" ) {
1269             position.top -= elemHeight /
2;
1270         }
1271
1272         position.left += myOffset[
0 ];
1273         position.top += myOffset[
1 ];
1274
1275         
// if the browser doesn't support fractions, then round for consistent results
1276         
if ( !supportsOffsetFractions ) {
1277             position.left = round( position.left );
1278             position.top = round( position.top );
1279         }
1280
1281         collisionPosition = {
1282             marginLeft: marginLeft,
1283             marginTop: marginTop
1284         };
1285
1286         $.each( [
"left", "top" ], function( i, dir ) {
1287             
if ( $.ui.position[ collision[ i ] ] ) {
1288                 $.ui.position[ collision[ i ] ][ dir ]( position, {
1289                     targetWidth: targetWidth,
1290                     targetHeight: targetHeight,
1291                     elemWidth: elemWidth,
1292                     elemHeight: elemHeight,
1293                     collisionPosition: collisionPosition,
1294                     collisionWidth: collisionWidth,
1295                     collisionHeight: collisionHeight,
1296                     offset: [ atOffset[
0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
1297                     my: options.my,
1298                     at: options.at,
1299                     within: within,
1300                     elem: elem
1301                 });
1302             }
1303         });
1304
1305         
if ( options.using ) {
1306             
// adds feedback as second argument to using callback, if present
1307             
using = function( props ) {
1308                 
var left = targetOffset.left - position.left,
1309                     right = left + targetWidth - elemWidth,
1310                     top = targetOffset.top - position.top,
1311                     bottom = top + targetHeight - elemHeight,
1312                     feedback = {
1313                         target: {
1314                             element: target,
1315                             left: targetOffset.left,
1316                             top: targetOffset.top,
1317                             width: targetWidth,
1318                             height: targetHeight
1319                         },
1320                         element: {
1321                             element: elem,
1322                             left: position.left,
1323                             top: position.top,
1324                             width: elemWidth,
1325                             height: elemHeight
1326                         },
1327                         horizontal: right <
0 ? "left" : left > 0 ? "right" : "center",
1328                         vertical: bottom <
0 ? "top" : top > 0 ? "bottom" : "middle"
1329                     };
1330                 
if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
1331                     feedback.horizontal =
"center";
1332                 }
1333                 
if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
1334                     feedback.vertical =
"middle";
1335                 }
1336                 
if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
1337                     feedback.important =
"horizontal";
1338                 }
else {
1339                     feedback.important =
"vertical";
1340                 }
1341                 options.
using.call( this, props, feedback );
1342             };
1343         }
1344
1345         elem.offset( $.extend( position, {
using: using } ) );
1346     });
1347 };
1348
1349 $.ui.position = {
1350     fit: {
1351         left: function( position, data ) {
1352             
var within = data.within,
1353                 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
1354                 outerWidth = within.width,
1355                 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1356                 overLeft = withinOffset - collisionPosLeft,
1357                 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
1358                 newOverRight;
1359
1360             
// element is wider than within
1361             
if ( data.collisionWidth > outerWidth ) {
1362                 
// element is initially over the left side of within
1363                 
if ( overLeft > 0 && overRight <= 0 ) {
1364                     newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
1365                     position.left += overLeft - newOverRight;
1366                 
// element is initially over right side of within
1367                 }
else if ( overRight > 0 && overLeft <= 0 ) {
1368                     position.left = withinOffset;
1369                 
// element is initially over both left and right sides of within
1370                 }
else {
1371                     
if ( overLeft > overRight ) {
1372                         position.left = withinOffset + outerWidth - data.collisionWidth;
1373                     }
else {
1374                         position.left = withinOffset;
1375                     }
1376                 }
1377             
// too far left -> align with left edge
1378             }
else if ( overLeft > 0 ) {
1379                 position.left += overLeft;
1380             
// too far right -> align with right edge
1381             }
else if ( overRight > 0 ) {
1382                 position.left -= overRight;
1383             
// adjust based on position and margin
1384             }
else {
1385                 position.left = max( position.left - collisionPosLeft, position.left );
1386             }
1387         },
1388         top: function( position, data ) {
1389             
var within = data.within,
1390                 withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
1391                 outerHeight = data.within.height,
1392                 collisionPosTop = position.top - data.collisionPosition.marginTop,
1393                 overTop = withinOffset - collisionPosTop,
1394                 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
1395                 newOverBottom;
1396
1397             
// element is taller than within
1398             
if ( data.collisionHeight > outerHeight ) {
1399                 
// element is initially over the top of within
1400                 
if ( overTop > 0 && overBottom <= 0 ) {
1401                     newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
1402                     position.top += overTop - newOverBottom;
1403                 
// element is initially over bottom of within
1404                 }
else if ( overBottom > 0 && overTop <= 0 ) {
1405                     position.top = withinOffset;
1406                 
// element is initially over both top and bottom of within
1407                 }
else {
1408                     
if ( overTop > overBottom ) {
1409                         position.top = withinOffset + outerHeight - data.collisionHeight;
1410                     }
else {
1411                         position.top = withinOffset;
1412                     }
1413                 }
1414             
// too far up -> align with top
1415             }
else if ( overTop > 0 ) {
1416                 position.top += overTop;
1417             
// too far down -> align with bottom edge
1418             }
else if ( overBottom > 0 ) {
1419                 position.top -= overBottom;
1420             
// adjust based on position and margin
1421             }
else {
1422                 position.top = max( position.top - collisionPosTop, position.top );
1423             }
1424         }
1425     },
1426     flip: {
1427         left: function( position, data ) {
1428             
var within = data.within,
1429                 withinOffset = within.offset.left + within.scrollLeft,
1430                 outerWidth = within.width,
1431                 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
1432                 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1433                 overLeft = collisionPosLeft - offsetLeft,
1434                 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
1435                 myOffset = data.my[
0 ] === "left" ?
1436                     -data.elemWidth :
1437                     data.my[
0 ] === "right" ?
1438                         data.elemWidth :
1439                         
0,
1440                 atOffset = data.at[
0 ] === "left" ?
1441                     data.targetWidth :
1442                     data.at[
0 ] === "right" ?
1443                         -data.targetWidth :
1444                         
0,
1445                 offset = -
2 * data.offset[ 0 ],
1446                 newOverRight,
1447                 newOverLeft;
1448
1449             
if ( overLeft < 0 ) {
1450                 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
1451                 
if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
1452                     position.left += myOffset + atOffset + offset;
1453                 }
1454             }
else if ( overRight > 0 ) {
1455                 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
1456                 
if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
1457                     position.left += myOffset + atOffset + offset;
1458                 }
1459             }
1460         },
1461         top: function( position, data ) {
1462             
var within = data.within,
1463                 withinOffset = within.offset.top + within.scrollTop,
1464                 outerHeight = within.height,
1465                 offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
1466                 collisionPosTop = position.top - data.collisionPosition.marginTop,
1467                 overTop = collisionPosTop - offsetTop,
1468                 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
1469                 top = data.my[
1 ] === "top",
1470                 myOffset = top ?
1471                     -data.elemHeight :
1472                     data.my[
1 ] === "bottom" ?
1473                         data.elemHeight :
1474                         
0,
1475                 atOffset = data.at[
1 ] === "top" ?
1476                     data.targetHeight :
1477                     data.at[
1 ] === "bottom" ?
1478                         -data.targetHeight :
1479                         
0,
1480                 offset = -
2 * data.offset[ 1 ],
1481                 newOverTop,
1482                 newOverBottom;
1483             
if ( overTop < 0 ) {
1484                 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
1485                 
if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
1486                     position.top += myOffset + atOffset + offset;
1487                 }
1488             }
else if ( overBottom > 0 ) {
1489                 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
1490                 
if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
1491                     position.top += myOffset + atOffset + offset;
1492                 }
1493             }
1494         }
1495     },
1496     flipfit: {
1497         left: function() {
1498             $.ui.position.flip.left.apply(
this, arguments );
1499             $.ui.position.fit.left.apply(
this, arguments );
1500         },
1501         top: function() {
1502             $.ui.position.flip.top.apply(
this, arguments );
1503             $.ui.position.fit.top.apply(
this, arguments );
1504         }
1505     }
1506 };

1507
1508 // fraction support test

1509 (function() {
1510     
var testElement, testElementParent, testElementStyle, offsetLeft, i,
1511         body = document.getElementsByTagName(
"body" )[ 0 ],
1512         div = document.createElement(
"div" );
1513
1514     
//Create a "fake body" for testing based on method used in jQuery.support
1515     testElement = document.createElement( body ?
"div" : "body" );
1516     testElementStyle = {
1517         visibility:
"hidden",
1518         width:
0,
1519         height:
0,
1520         border:
0,
1521         margin:
0,
1522         background:
"none"
1523     };
1524     
if ( body ) {
1525         $.extend( testElementStyle, {
1526             position:
"absolute",
1527             left:
"-1000px",
1528             top:
"-1000px"
1529         });
1530     }
1531     
for ( i in testElementStyle ) {
1532         testElement.style[ i ] = testElementStyle[ i ];
1533     }
1534     testElement.appendChild( div );
1535     testElementParent = body || document.documentElement;
1536     testElementParent.insertBefore( testElement, testElementParent.firstChild );
1537
1538     div.style.cssText =
"position: absolute; left: 10.7432222px;";
1539
1540     offsetLeft = $( div ).offset().left;
1541     supportsOffsetFractions = offsetLeft >
10 && offsetLeft < 11;
1542
1543     testElement.innerHTML =
"";
1544     testElementParent.removeChild( testElement );
1545 })();
1546
1547 })();

1548
1549 var
position = $.ui.position;
1550
1551
1552 /*!
1553  * jQuery UI Accordion
1.11.4
1554  * http://jqueryui.com
1555  *
1556  * Copyright jQuery Foundation and other contributors
1557  * Released under the MIT license.
1558  * http://jquery.org/license
1559  *
1560  * http://api.jqueryui.com/accordion/
1561  */

1562
1563
1564 var
accordion = $.widget( "ui.accordion", {
1565     version:
"1.11.4",
1566     options: {
1567         active:
0,
1568         animate: {},
1569         collapsible:
false,
1570         
event: "click",
1571         header:
"> li > :first-child,> :not(li):even",
1572         heightStyle:
"auto",
1573         icons: {
1574             activeHeader:
"ui-icon-triangle-1-s",
1575             header:
"ui-icon-triangle-1-e"
1576         },
1577
1578         
// callbacks
1579         activate:
null,
1580         beforeActivate:
null
1581     },
1582
1583     hideProps: {
1584         borderTopWidth:
"hide",
1585         borderBottomWidth:
"hide",
1586         paddingTop:
"hide",
1587         paddingBottom:
"hide",
1588         height:
"hide"
1589     },
1590
1591     showProps: {
1592         borderTopWidth:
"show",
1593         borderBottomWidth:
"show",
1594         paddingTop:
"show",
1595         paddingBottom:
"show",
1596         height:
"show"
1597     },
1598
1599     _create: function() {
1600         
var options = this.options;
1601         
this.prevShow = this.prevHide = $();
1602         
this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
1603             
// ARIA
1604             .attr(
"role", "tablist" );
1605
1606         
// don't allow collapsible: false and active: false / null
1607         
if ( !options.collapsible && (options.active === false || options.active == null) ) {
1608             options.active =
0;
1609         }
1610
1611         
this._processPanels();
1612         
// handle negative values
1613         
if ( options.active < 0 ) {
1614             options.active +=
this.headers.length;
1615         }
1616         
this._refresh();
1617     },
1618
1619     _getCreateEventData: function() {
1620         
return {
1621             header:
this.active,
1622             panel: !
this.active.length ? $() : this.active.next()
1623         };
1624     },
1625
1626     _createIcons: function() {
1627         
var icons = this.options.icons;
1628         
if ( icons ) {
1629             $(
"<span>" )
1630                 .addClass(
"ui-accordion-header-icon ui-icon " + icons.header )
1631                 .prependTo(
this.headers );
1632             
this.active.children( ".ui-accordion-header-icon" )
1633                 .removeClass( icons.header )
1634                 .addClass( icons.activeHeader );
1635             
this.headers.addClass( "ui-accordion-icons" );
1636         }
1637     },
1638
1639     _destroyIcons: function() {
1640         
this.headers
1641             .removeClass(
"ui-accordion-icons" )
1642             .children(
".ui-accordion-header-icon" )
1643                 .
remove();
1644     },
1645
1646     _destroy: function() {
1647         
var contents;
1648
1649         
// clean up main element
1650         
this.element
1651             .removeClass(
"ui-accordion ui-widget ui-helper-reset" )
1652             .removeAttr(
"role" );
1653
1654         
// clean up headers
1655         
this.headers
1656             .removeClass(
"ui-accordion-header ui-accordion-header-active ui-state-default " +
1657                 
"ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
1658             .removeAttr(
"role" )
1659             .removeAttr(
"aria-expanded" )
1660             .removeAttr(
"aria-selected" )
1661             .removeAttr(
"aria-controls" )
1662             .removeAttr(
"tabIndex" )
1663             .removeUniqueId();
1664
1665         
this._destroyIcons();
1666
1667         
// clean up content panels
1668         contents =
this.headers.next()
1669             .removeClass(
"ui-helper-reset ui-widget-content ui-corner-bottom " +
1670                 
"ui-accordion-content ui-accordion-content-active ui-state-disabled" )
1671             .css(
"display", "" )
1672             .removeAttr(
"role" )
1673             .removeAttr(
"aria-hidden" )
1674             .removeAttr(
"aria-labelledby" )
1675             .removeUniqueId();
1676
1677         
if ( this.options.heightStyle !== "content" ) {
1678             contents.css(
"height", "" );
1679         }
1680     },
1681
1682     _setOption: function( key,
value ) {
1683         
if ( key === "active" ) {
1684             
// _activate() will handle invalid values and update this.options
1685             
this._activate( value );
1686             
return;
1687         }
1688
1689         
if ( key === "event" ) {
1690             
if ( this.options.event ) {
1691                 
this._off( this.headers, this.options.event );
1692             }
1693             
this._setupEvents( value );
1694         }
1695
1696         
this._super( key, value );
1697
1698         
// setting collapsible: false while collapsed; open first panel
1699         
if ( key === "collapsible" && !value && this.options.active === false ) {
1700             
this._activate( 0 );
1701         }
1702
1703         
if ( key === "icons" ) {
1704             
this._destroyIcons();
1705             
if ( value ) {
1706                 
this._createIcons();
1707             }
1708         }
1709
1710         
// #5332 - opacity doesn't cascade to positioned elements in IE
1711         
// so we need to add the disabled class to the headers and panels
1712         
if ( key === "disabled" ) {
1713             
this.element
1714                 .toggleClass(
"ui-state-disabled", !!value )
1715                 .attr(
"aria-disabled", value );
1716             
this.headers.add( this.headers.next() )
1717                 .toggleClass(
"ui-state-disabled", !!value );
1718         }
1719     },
1720
1721     _keydown: function(
event ) {
1722         
if ( event.altKey || event.ctrlKey ) {
1723             
return;
1724         }
1725
1726         
var keyCode = $.ui.keyCode,
1727             length =
this.headers.length,
1728             currentIndex =
this.headers.index( event.target ),
1729             toFocus =
false;
1730
1731         
switch ( event.keyCode ) {
1732             
case keyCode.RIGHT:
1733             
case keyCode.DOWN:
1734                 toFocus =
this.headers[ ( currentIndex + 1 ) % length ];
1735                 
break;
1736             
case keyCode.LEFT:
1737             
case keyCode.UP:
1738                 toFocus =
this.headers[ ( currentIndex - 1 + length ) % length ];
1739                 
break;
1740             
case keyCode.SPACE:
1741             
case keyCode.ENTER:
1742                 
this._eventHandler( event );
1743                 
break;
1744             
case keyCode.HOME:
1745                 toFocus =
this.headers[ 0 ];
1746                 
break;
1747             
case keyCode.END:
1748                 toFocus =
this.headers[ length - 1 ];
1749                 
break;
1750         }
1751
1752         
if ( toFocus ) {
1753             $(
event.target ).attr( "tabIndex", -1 );
1754             $( toFocus ).attr(
"tabIndex", 0 );
1755             toFocus.focus();
1756             
event.preventDefault();
1757         }
1758     },
1759
1760     _panelKeyDown: function(
event ) {
1761         
if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
1762             $(
event.currentTarget ).prev().focus();
1763         }
1764     },
1765
1766     refresh: function() {
1767         
var options = this.options;
1768         
this._processPanels();
1769
1770         
// was collapsed or no panel
1771         
if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
1772             options.active =
false;
1773             
this.active = $();
1774         
// active false only when collapsible is true
1775         }
else if ( options.active === false ) {
1776             
this._activate( 0 );
1777         
// was active, but active panel is gone
1778         }
else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
1779             
// all remaining panel are disabled
1780             
if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
1781                 options.active =
false;
1782                 
this.active = $();
1783             
// activate previous panel
1784             }
else {
1785                 
this._activate( Math.max( 0, options.active - 1 ) );
1786             }
1787         
// was active, active panel still exists
1788         }
else {
1789             
// make sure active index is correct
1790             options.active =
this.headers.index( this.active );
1791         }
1792
1793         
this._destroyIcons();
1794
1795         
this._refresh();
1796     },
1797
1798     _processPanels: function() {
1799         
var prevHeaders = this.headers,
1800             prevPanels =
this.panels;
1801
1802         
this.headers = this.element.find( this.options.header )
1803             .addClass(
"ui-accordion-header ui-state-default ui-corner-all" );
1804
1805         
this.panels = this.headers.next()
1806             .addClass(
"ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
1807             .filter(
":not(.ui-accordion-content-active)" )
1808             .hide();
1809
1810         
// Avoid memory leaks (#10056)
1811         
if ( prevPanels ) {
1812             
this._off( prevHeaders.not( this.headers ) );
1813             
this._off( prevPanels.not( this.panels ) );
1814         }
1815     },
1816
1817     _refresh: function() {
1818         
var maxHeight,
1819             options =
this.options,
1820             heightStyle = options.heightStyle,
1821             parent =
this.element.parent();
1822
1823         
this.active = this._findActive( options.active )
1824             .addClass(
"ui-accordion-header-active ui-state-active ui-corner-top" )
1825             .removeClass(
"ui-corner-all" );
1826         
this.active.next()
1827             .addClass(
"ui-accordion-content-active" )
1828             .show();
1829
1830         
this.headers
1831             .attr(
"role", "tab" )
1832             .each(function() {
1833                 
var header = $( this ),
1834                     headerId = header.uniqueId().attr(
"id" ),
1835                     panel = header.next(),
1836                     panelId = panel.uniqueId().attr(
"id" );
1837                 header.attr(
"aria-controls", panelId );
1838                 panel.attr(
"aria-labelledby", headerId );
1839             })
1840             .next()
1841                 .attr(
"role", "tabpanel" );
1842
1843         
this.headers
1844             .not(
this.active )
1845             .attr({
1846                 
"aria-selected": "false",
1847                 
"aria-expanded": "false",
1848                 tabIndex: -
1
1849             })
1850             .next()
1851                 .attr({
1852                     
"aria-hidden": "true"
1853                 })
1854                 .hide();
1855
1856         
// make sure at least one header is in the tab order
1857         
if ( !this.active.length ) {
1858             
this.headers.eq( 0 ).attr( "tabIndex", 0 );
1859         }
else {
1860             
this.active.attr({
1861                 
"aria-selected": "true",
1862                 
"aria-expanded": "true",
1863                 tabIndex:
0
1864             })
1865             .next()
1866                 .attr({
1867                     
"aria-hidden": "false"
1868                 });
1869         }
1870
1871         
this._createIcons();
1872
1873         
this._setupEvents( options.event );
1874
1875         
if ( heightStyle === "fill" ) {
1876             maxHeight = parent.height();
1877             
this.element.siblings( ":visible" ).each(function() {
1878                 
var elem = $( this ),
1879                     position = elem.css(
"position" );
1880
1881                 
if ( position === "absolute" || position === "fixed" ) {
1882                     
return;
1883                 }
1884                 maxHeight -= elem.outerHeight(
true );
1885             });
1886
1887             
this.headers.each(function() {
1888                 maxHeight -= $(
this ).outerHeight( true );
1889             });
1890
1891             
this.headers.next()
1892                 .each(function() {
1893                     $(
this ).height( Math.max( 0, maxHeight -
1894                         $(
this ).innerHeight() + $( this ).height() ) );
1895                 })
1896                 .css(
"overflow", "auto" );
1897         }
else if ( heightStyle === "auto" ) {
1898             maxHeight =
0;
1899             
this.headers.next()
1900                 .each(function() {
1901                     maxHeight = Math.max( maxHeight, $(
this ).css( "height", "" ).height() );
1902                 })
1903                 .height( maxHeight );
1904         }
1905     },
1906
1907     _activate: function( index ) {
1908         
var active = this._findActive( index )[ 0 ];
1909
1910         
// trying to activate the already active panel
1911         
if ( active === this.active[ 0 ] ) {
1912             
return;
1913         }
1914
1915         
// trying to collapse, simulate a click on the currently active header
1916         active = active ||
this.active[ 0 ];
1917
1918         
this._eventHandler({
1919             target: active,
1920             currentTarget: active,
1921             preventDefault: $.noop
1922         });
1923     },
1924
1925     _findActive: function( selector ) {
1926         
return typeof selector === "number" ? this.headers.eq( selector ) : $();
1927     },
1928
1929     _setupEvents: function(
event ) {
1930         
var events = {
1931             keydown:
"_keydown"
1932         };
1933         
if ( event ) {
1934             $.each(
event.split( " " ), function( index, eventName ) {
1935                 events[ eventName ] =
"_eventHandler";
1936             });
1937         }
1938
1939         
this._off( this.headers.add( this.headers.next() ) );
1940         
this._on( this.headers, events );
1941         
this._on( this.headers.next(), { keydown: "_panelKeyDown" });
1942         
this._hoverable( this.headers );
1943         
this._focusable( this.headers );
1944     },
1945
1946     _eventHandler: function(
event ) {
1947         
var options = this.options,
1948             active =
this.active,
1949             clicked = $(
event.currentTarget ),
1950             clickedIsActive = clicked[
0 ] === active[ 0 ],
1951             collapsing = clickedIsActive && options.collapsible,
1952             toShow = collapsing ? $() : clicked.next(),
1953             toHide = active.next(),
1954             eventData = {
1955                 oldHeader: active,
1956                 oldPanel: toHide,
1957                 newHeader: collapsing ? $() : clicked,
1958                 newPanel: toShow
1959             };
1960
1961         
event.preventDefault();
1962
1963         
if (
1964                 
// click on active header, but not collapsible
1965                 ( clickedIsActive && !options.collapsible ) ||
1966                 
// allow canceling activation
1967                 (
this._trigger( "beforeActivate", event, eventData ) === false ) ) {
1968             
return;
1969         }
1970
1971         options.active = collapsing ?
false : this.headers.index( clicked );
1972
1973         
// when the call to ._toggle() comes after the class changes
1974         
// it causes a very odd bug in IE 8 (see #6720)
1975         
this.active = clickedIsActive ? $() : clicked;
1976         
this._toggle( eventData );
1977
1978         
// switch classes
1979         
// corner classes on the previously active header stay after the animation
1980         active.removeClass(
"ui-accordion-header-active ui-state-active" );
1981         
if ( options.icons ) {
1982             active.children(
".ui-accordion-header-icon" )
1983                 .removeClass( options.icons.activeHeader )
1984                 .addClass( options.icons.header );
1985         }
1986
1987         
if ( !clickedIsActive ) {
1988             clicked
1989                 .removeClass(
"ui-corner-all" )
1990                 .addClass(
"ui-accordion-header-active ui-state-active ui-corner-top" );
1991             
if ( options.icons ) {
1992                 clicked.children(
".ui-accordion-header-icon" )
1993                     .removeClass( options.icons.header )
1994                     .addClass( options.icons.activeHeader );
1995             }
1996
1997             clicked
1998                 .next()
1999                 .addClass(
"ui-accordion-content-active" );
2000         }
2001     },
2002
2003     _toggle: function( data ) {
2004         
var toShow = data.newPanel,
2005             toHide =
this.prevShow.length ? this.prevShow : data.oldPanel;
2006
2007         
// handle activating a panel during the animation for another activation
2008         
this.prevShow.add( this.prevHide ).stop( true, true );
2009         
this.prevShow = toShow;
2010         
this.prevHide = toHide;
2011
2012         
if ( this.options.animate ) {
2013             
this._animate( toShow, toHide, data );
2014         }
else {
2015             toHide.hide();
2016             toShow.show();
2017             
this._toggleComplete( data );
2018         }
2019
2020         toHide.attr({
2021             
"aria-hidden": "true"
2022         });
2023         toHide.prev().attr({
2024             
"aria-selected": "false",
2025             
"aria-expanded": "false"
2026         });
2027         
// if we're switching panels, remove the old header from the tab order
2028         
// if we're opening from collapsed state, remove the previous header from the tab order
2029         
// if we're collapsing, then keep the collapsing header in the tab order
2030         
if ( toShow.length && toHide.length ) {
2031             toHide.prev().attr({
2032                 
"tabIndex": -1,
2033                 
"aria-expanded": "false"
2034             });
2035         }
else if ( toShow.length ) {
2036             
this.headers.filter(function() {
2037                 
return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
2038             })
2039             .attr(
"tabIndex", -1 );
2040         }
2041
2042         toShow
2043             .attr(
"aria-hidden", "false" )
2044             .prev()
2045                 .attr({
2046                     
"aria-selected": "true",
2047                     
"aria-expanded": "true",
2048                     tabIndex:
0
2049                 });
2050     },
2051
2052     _animate: function( toShow, toHide, data ) {
2053         
var total, easing, duration,
2054             that =
this,
2055             adjust =
0,
2056             boxSizing = toShow.css(
"box-sizing" ),
2057             down = toShow.length &&
2058                 ( !toHide.length || ( toShow.index() < toHide.index() ) ),
2059             animate =
this.options.animate || {},
2060             options = down && animate.down || animate,
2061             complete = function() {
2062                 that._toggleComplete( data );
2063             };
2064
2065         
if ( typeof options === "number" ) {
2066             duration = options;
2067         }
2068         
if ( typeof options === "string" ) {
2069             easing = options;
2070         }
2071         
// fall back from options to animation in case of partial down settings
2072         easing = easing || options.easing || animate.easing;
2073         duration = duration || options.duration || animate.duration;
2074
2075         
if ( !toHide.length ) {
2076             
return toShow.animate( this.showProps, duration, easing, complete );
2077         }
2078         
if ( !toShow.length ) {
2079             
return toHide.animate( this.hideProps, duration, easing, complete );
2080         }
2081
2082         total = toShow.show().outerHeight();
2083         toHide.animate(
this.hideProps, {
2084             duration: duration,
2085             easing: easing,
2086             step: function( now, fx ) {
2087                 fx.now = Math.round( now );
2088             }
2089         });
2090         toShow
2091             .hide()
2092             .animate(
this.showProps, {
2093                 duration: duration,
2094                 easing: easing,
2095                 complete: complete,
2096                 step: function( now, fx ) {
2097                     fx.now = Math.round( now );
2098                     
if ( fx.prop !== "height" ) {
2099                         
if ( boxSizing === "content-box" ) {
2100                             adjust += fx.now;
2101                         }
2102                     }
else if ( that.options.heightStyle !== "content" ) {
2103                         fx.now = Math.round( total - toHide.outerHeight() - adjust );
2104                         adjust =
0;
2105                     }
2106                 }
2107             });
2108     },
2109
2110     _toggleComplete: function( data ) {
2111         
var toHide = data.oldPanel;
2112
2113         toHide
2114             .removeClass(
"ui-accordion-content-active" )
2115             .prev()
2116                 .removeClass(
"ui-corner-top" )
2117                 .addClass(
"ui-corner-all" );
2118
2119         
// Work around for rendering bug in IE (#5421)
2120         
if ( toHide.length ) {
2121             toHide.parent()[
0 ].className = toHide.parent()[ 0 ].className;
2122         }
2123         
this._trigger( "activate", null, data );
2124     }
2125 });

2126
2127
2128 /*!
2129  * jQuery UI Menu
1.11.4
2130  * http://jqueryui.com
2131  *
2132  * Copyright jQuery Foundation and other contributors
2133  * Released under the MIT license.
2134  * http://jquery.org/license
2135  *
2136  * http://api.jqueryui.com/menu/
2137  */

2138
2139
2140 var
menu = $.widget( "ui.menu", {
2141     version:
"1.11.4",
2142     defaultElement:
"<ul>",
2143     delay:
300,
2144     options: {
2145         icons: {
2146             submenu:
"ui-icon-carat-1-e"
2147         },
2148         items:
"> *",
2149         menus:
"ul",
2150         position: {
2151             my:
"left-1 top",
2152             at:
"right top"
2153         },
2154         role:
"menu",
2155
2156         
// callbacks
2157         blur:
null,
2158         focus:
null,
2159         
select: null
2160     },
2161
2162     _create: function() {
2163         
this.activeMenu = this.element;
2164
2165         
// Flag used to prevent firing of the click handler
2166         
// as the event bubbles up through nested menus
2167         
this.mouseHandled = false;
2168         
this.element
2169             .uniqueId()
2170             .addClass(
"ui-menu ui-widget ui-widget-content" )
2171             .toggleClass(
"ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
2172             .attr({
2173                 role:
this.options.role,
2174                 tabIndex:
0
2175             });
2176
2177         
if ( this.options.disabled ) {
2178             
this.element
2179                 .addClass(
"ui-state-disabled" )
2180                 .attr(
"aria-disabled", "true" );
2181         }
2182
2183         
this._on({
2184             
// Prevent focus from sticking to links inside menu after clicking
2185             
// them (focus should always stay on UL during navigation).
2186             
"mousedown .ui-menu-item": function( event ) {
2187                 
event.preventDefault();
2188             },
2189             
"click .ui-menu-item": function( event ) {
2190                 
var target = $( event.target );
2191                 
if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
2192                     
this.select( event );
2193
2194                     
// Only set the mouseHandled flag if the event will bubble, see #9469.
2195                     
if ( !event.isPropagationStopped() ) {
2196                         
this.mouseHandled = true;
2197                     }
2198
2199                     
// Open submenu on click
2200                     
if ( target.has( ".ui-menu" ).length ) {
2201                         
this.expand( event );
2202                     }
else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
2203
2204                         
// Redirect focus to the menu
2205                         
this.element.trigger( "focus", [ true ] );
2206
2207                         
// If the active item is on the top level, let it stay active.
2208                         
// Otherwise, blur the active item since it is no longer visible.
2209                         
if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
2210                             clearTimeout(
this.timer );
2211                         }
2212                     }
2213                 }
2214             },
2215             
"mouseenter .ui-menu-item": function( event ) {
2216                 
// Ignore mouse events while typeahead is active, see #10458.
2217                 
// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
2218                 
// is over an item in the menu
2219                 
if ( this.previousFilter ) {
2220                     
return;
2221                 }
2222                 
var target = $( event.currentTarget );
2223                 
// Remove ui-state-active class from siblings of the newly focused menu item
2224                 
// to avoid a jump caused by adjacent elements both having a class with a border
2225                 target.siblings(
".ui-state-active" ).removeClass( "ui-state-active" );
2226                 
this.focus( event, target );
2227             },
2228             mouseleave:
"collapseAll",
2229             
"mouseleave .ui-menu": "collapseAll",
2230             focus: function(
event, keepActiveItem ) {
2231                 
// If there's already an active item, keep it active
2232                 
// If not, activate the first item
2233                 
var item = this.active || this.element.find( this.options.items ).eq( 0 );
2234
2235                 
if ( !keepActiveItem ) {
2236                     
this.focus( event, item );
2237                 }
2238             },
2239             blur: function(
event ) {
2240                 
this._delay(function() {
2241                     
if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
2242                         
this.collapseAll( event );
2243                     }
2244                 });
2245             },
2246             keydown:
"_keydown"
2247         });
2248
2249         
this.refresh();
2250
2251         
// Clicks outside of a menu collapse any open menus
2252         
this._on( this.document, {
2253             click: function(
event ) {
2254                 
if ( this._closeOnDocumentClick( event ) ) {
2255                     
this.collapseAll( event );
2256                 }
2257
2258                 
// Reset the mouseHandled flag
2259                 
this.mouseHandled = false;
2260             }
2261         });
2262     },
2263
2264     _destroy: function() {
2265         
// Destroy (sub)menus
2266         
this.element
2267             .removeAttr(
"aria-activedescendant" )
2268             .find(
".ui-menu" ).addBack()
2269                 .removeClass(
"ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
2270                 .removeAttr(
"role" )
2271                 .removeAttr(
"tabIndex" )
2272                 .removeAttr(
"aria-labelledby" )
2273                 .removeAttr(
"aria-expanded" )
2274                 .removeAttr(
"aria-hidden" )
2275                 .removeAttr(
"aria-disabled" )
2276                 .removeUniqueId()
2277                 .show();
2278
2279         
// Destroy menu items
2280         
this.element.find( ".ui-menu-item" )
2281             .removeClass(
"ui-menu-item" )
2282             .removeAttr(
"role" )
2283             .removeAttr(
"aria-disabled" )
2284             .removeUniqueId()
2285             .removeClass(
"ui-state-hover" )
2286             .removeAttr(
"tabIndex" )
2287             .removeAttr(
"role" )
2288             .removeAttr(
"aria-haspopup" )
2289             .children().each( function() {
2290                 
var elem = $( this );
2291                 
if ( elem.data( "ui-menu-submenu-carat" ) ) {
2292                     elem.
remove();
2293                 }
2294             });
2295
2296         
// Destroy menu dividers
2297         
this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
2298     },
2299
2300     _keydown: function(
event ) {
2301         
var match, prev, character, skip,
2302             preventDefault =
true;
2303
2304         
switch ( event.keyCode ) {
2305         
case $.ui.keyCode.PAGE_UP:
2306             
this.previousPage( event );
2307             
break;
2308         
case $.ui.keyCode.PAGE_DOWN:
2309             
this.nextPage( event );
2310             
break;
2311         
case $.ui.keyCode.HOME:
2312             
this._move( "first", "first", event );
2313             
break;
2314         
case $.ui.keyCode.END:
2315             
this._move( "last", "last", event );
2316             
break;
2317         
case $.ui.keyCode.UP:
2318             
this.previous( event );
2319             
break;
2320         
case $.ui.keyCode.DOWN:
2321             
this.next( event );
2322             
break;
2323         
case $.ui.keyCode.LEFT:
2324             
this.collapse( event );
2325             
break;
2326         
case $.ui.keyCode.RIGHT:
2327             
if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
2328                 
this.expand( event );
2329             }
2330             
break;
2331         
case $.ui.keyCode.ENTER:
2332         
case $.ui.keyCode.SPACE:
2333             
this._activate( event );
2334             
break;
2335         
case $.ui.keyCode.ESCAPE:
2336             
this.collapse( event );
2337             
break;
2338         
default:
2339             preventDefault =
false;
2340             prev =
this.previousFilter || "";
2341             character = String.fromCharCode(
event.keyCode );
2342             skip =
false;
2343
2344             clearTimeout(
this.filterTimer );
2345
2346             
if ( character === prev ) {
2347                 skip =
true;
2348             }
else {
2349                 character = prev + character;
2350             }
2351
2352             match =
this._filterMenuItems( character );
2353             match = skip && match.index(
this.active.next() ) !== -1 ?
2354                 
this.active.nextAll( ".ui-menu-item" ) :
2355                 match;
2356
2357             
// If no matches on the current filter, reset to the last character pressed
2358             
// to move down the menu to the first item that starts with that character
2359             
if ( !match.length ) {
2360                 character = String.fromCharCode(
event.keyCode );
2361                 match =
this._filterMenuItems( character );
2362             }
2363
2364             
if ( match.length ) {
2365                 
this.focus( event, match );
2366                 
this.previousFilter = character;
2367                 
this.filterTimer = this._delay(function() {
2368                     delete
this.previousFilter;
2369                 },
1000 );
2370             }
else {
2371                 delete
this.previousFilter;
2372             }
2373         }
2374
2375         
if ( preventDefault ) {
2376             
event.preventDefault();
2377         }
2378     },
2379
2380     _activate: function(
event ) {
2381         
if ( !this.active.is( ".ui-state-disabled" ) ) {
2382             
if ( this.active.is( "[aria-haspopup='true']" ) ) {
2383                 
this.expand( event );
2384             }
else {
2385                 
this.select( event );
2386             }
2387         }
2388     },
2389
2390     refresh: function() {
2391         
var menus, items,
2392             that =
this,
2393             icon =
this.options.icons.submenu,
2394             submenus =
this.element.find( this.options.menus );
2395
2396         
this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
2397
2398         
// Initialize nested menus
2399         submenus.filter(
":not(.ui-menu)" )
2400             .addClass(
"ui-menu ui-widget ui-widget-content ui-front" )
2401             .hide()
2402             .attr({
2403                 role:
this.options.role,
2404                 
"aria-hidden": "true",
2405                 
"aria-expanded": "false"
2406             })
2407             .each(function() {
2408                 
var menu = $( this ),
2409                     item = menu.parent(),
2410                     submenuCarat = $(
"<span>" )
2411                         .addClass(
"ui-menu-icon ui-icon " + icon )
2412                         .data(
"ui-menu-submenu-carat", true );
2413
2414                 item
2415                     .attr(
"aria-haspopup", "true" )
2416                     .prepend( submenuCarat );
2417                 menu.attr(
"aria-labelledby", item.attr( "id" ) );
2418             });
2419
2420         menus = submenus.
add( this.element );
2421         items = menus.find(
this.options.items );
2422
2423         
// Initialize menu-items containing spaces and/or dashes only as dividers
2424         items.not(
".ui-menu-item" ).each(function() {
2425             
var item = $( this );
2426             
if ( that._isDivider( item ) ) {
2427                 item.addClass(
"ui-widget-content ui-menu-divider" );
2428             }
2429         });
2430
2431         
// Don't refresh list items that are already adapted
2432         items.not(
".ui-menu-item, .ui-menu-divider" )
2433             .addClass(
"ui-menu-item" )
2434             .uniqueId()
2435             .attr({
2436                 tabIndex: -
1,
2437                 role:
this._itemRole()
2438             });
2439
2440         
// Add aria-disabled attribute to any disabled menu item
2441         items.filter(
".ui-state-disabled" ).attr( "aria-disabled", "true" );
2442
2443         
// If the active item has been removed, blur the menu
2444         
if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
2445             
this.blur();
2446         }
2447     },
2448
2449     _itemRole: function() {
2450         
return {
2451             menu:
"menuitem",
2452             listbox:
"option"
2453         }[
this.options.role ];
2454     },
2455
2456     _setOption: function( key,
value ) {
2457         
if ( key === "icons" ) {
2458             
this.element.find( ".ui-menu-icon" )
2459                 .removeClass(
this.options.icons.submenu )
2460                 .addClass(
value.submenu );
2461         }
2462         
if ( key === "disabled" ) {
2463             
this.element
2464                 .toggleClass(
"ui-state-disabled", !!value )
2465                 .attr(
"aria-disabled", value );
2466         }
2467         
this._super( key, value );
2468     },
2469
2470     focus: function(
event, item ) {
2471         
var nested, focused;
2472         
this.blur( event, event && event.type === "focus" );
2473
2474         
this._scrollIntoView( item );
2475
2476         
this.active = item.first();
2477         focused =
this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
2478         
// Only update aria-activedescendant if there's a role
2479         
// otherwise we assume focus is managed elsewhere
2480         
if ( this.options.role ) {
2481             
this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
2482         }
2483
2484         
// Highlight active parent menu item, if any
2485         
this.active
2486             .parent()
2487             .closest(
".ui-menu-item" )
2488             .addClass(
"ui-state-active" );
2489
2490         
if ( event && event.type === "keydown" ) {
2491             
this._close();
2492         }
else {
2493             
this.timer = this._delay(function() {
2494                 
this._close();
2495             },
this.delay );
2496         }
2497
2498         nested = item.children(
".ui-menu" );
2499         
if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
2500             
this._startOpening(nested);
2501         }
2502         
this.activeMenu = item.parent();
2503
2504         
this._trigger( "focus", event, { item: item } );
2505     },
2506
2507     _scrollIntoView: function( item ) {
2508         
var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
2509         
if ( this._hasScroll() ) {
2510             borderTop = parseFloat( $.css(
this.activeMenu[0], "borderTopWidth" ) ) || 0;
2511             paddingTop = parseFloat( $.css(
this.activeMenu[0], "paddingTop" ) ) || 0;
2512             offset = item.offset().top -
this.activeMenu.offset().top - borderTop - paddingTop;
2513             scroll =
this.activeMenu.scrollTop();
2514             elementHeight =
this.activeMenu.height();
2515             itemHeight = item.outerHeight();
2516
2517             
if ( offset < 0 ) {
2518                 
this.activeMenu.scrollTop( scroll + offset );
2519             }
else if ( offset + itemHeight > elementHeight ) {
2520                 
this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
2521             }
2522         }
2523     },
2524
2525     blur: function(
event, fromFocus ) {
2526         
if ( !fromFocus ) {
2527             clearTimeout(
this.timer );
2528         }
2529
2530         
if ( !this.active ) {
2531             
return;
2532         }
2533
2534         
this.active.removeClass( "ui-state-focus" );
2535         
this.active = null;
2536
2537         
this._trigger( "blur", event, { item: this.active } );
2538     },
2539
2540     _startOpening: function( submenu ) {
2541         clearTimeout(
this.timer );
2542
2543         
// Don't open if already open fixes a Firefox bug that caused a .5 pixel
2544         
// shift in the submenu position when mousing over the carat icon
2545         
if ( submenu.attr( "aria-hidden" ) !== "true" ) {
2546             
return;
2547         }
2548
2549         
this.timer = this._delay(function() {
2550             
this._close();
2551             
this._open( submenu );
2552         },
this.delay );
2553     },
2554
2555     _open: function( submenu ) {
2556         
var position = $.extend({
2557             of:
this.active
2558         },
this.options.position );
2559
2560         clearTimeout(
this.timer );
2561         
this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
2562             .hide()
2563             .attr(
"aria-hidden", "true" );
2564
2565         submenu
2566             .show()
2567             .removeAttr(
"aria-hidden" )
2568             .attr(
"aria-expanded", "true" )
2569             .position( position );
2570     },
2571
2572     collapseAll: function(
event, all ) {
2573         clearTimeout(
this.timer );
2574         
this.timer = this._delay(function() {
2575             
// If we were passed an event, look for the submenu that contains the event
2576             
var currentMenu = all ? this.element :
2577                 $(
event && event.target ).closest( this.element.find( ".ui-menu" ) );
2578
2579             
// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
2580             
if ( !currentMenu.length ) {
2581                 currentMenu =
this.element;
2582             }
2583
2584             
this._close( currentMenu );
2585
2586             
this.blur( event );
2587             
this.activeMenu = currentMenu;
2588         },
this.delay );
2589     },
2590
2591     
// With no arguments, closes the currently active menu - if nothing is active
2592     
// it closes all menus. If passed an argument, it will search for menus BELOW
2593     _close: function( startMenu ) {
2594         
if ( !startMenu ) {
2595             startMenu =
this.active ? this.active.parent() : this.element;
2596         }
2597
2598         startMenu
2599             .find(
".ui-menu" )
2600                 .hide()
2601                 .attr(
"aria-hidden", "true" )
2602                 .attr(
"aria-expanded", "false" )
2603             .end()
2604             .find(
".ui-state-active" ).not( ".ui-state-focus" )
2605                 .removeClass(
"ui-state-active" );
2606     },
2607
2608     _closeOnDocumentClick: function(
event ) {
2609         
return !$( event.target ).closest( ".ui-menu" ).length;
2610     },
2611
2612     _isDivider: function( item ) {
2613
2614         
// Match hyphen, em dash, en dash
2615         
return !/[^\-\u2014\u2013\s]/.test( item.text() );
2616     },
2617
2618     collapse: function(
event ) {
2619         
var newItem = this.active &&
2620             
this.active.parent().closest( ".ui-menu-item", this.element );
2621         
if ( newItem && newItem.length ) {
2622             
this._close();
2623             
this.focus( event, newItem );
2624         }
2625     },
2626
2627     expand: function(
event ) {
2628         
var newItem = this.active &&
2629             
this.active
2630                 .children(
".ui-menu " )
2631                 .find(
this.options.items )
2632                 .first();
2633
2634         
if ( newItem && newItem.length ) {
2635             
this._open( newItem.parent() );
2636
2637             
// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
2638             
this._delay(function() {
2639                 
this.focus( event, newItem );
2640             });
2641         }
2642     },
2643
2644     next: function(
event ) {
2645         
this._move( "next", "first", event );
2646     },
2647
2648     previous: function(
event ) {
2649         
this._move( "prev", "last", event );
2650     },
2651
2652     isFirstItem: function() {
2653         
return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
2654     },
2655
2656     isLastItem: function() {
2657         
return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
2658     },
2659
2660     _move: function( direction, filter,
event ) {
2661         
var next;
2662         
if ( this.active ) {
2663             
if ( direction === "first" || direction === "last" ) {
2664                 next =
this.active
2665                     [ direction ===
"first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
2666                     .eq( -
1 );
2667             }
else {
2668                 next =
this.active
2669                     [ direction +
"All" ]( ".ui-menu-item" )
2670                     .eq(
0 );
2671             }
2672         }
2673         
if ( !next || !next.length || !this.active ) {
2674             next =
this.activeMenu.find( this.options.items )[ filter ]();
2675         }
2676
2677         
this.focus( event, next );
2678     },
2679
2680     nextPage: function(
event ) {
2681         
var item, base, height;
2682
2683         
if ( !this.active ) {
2684             
this.next( event );
2685             
return;
2686         }
2687         
if ( this.isLastItem() ) {
2688             
return;
2689         }
2690         
if ( this._hasScroll() ) {
2691             
base = this.active.offset().top;
2692             height =
this.element.height();
2693             
this.active.nextAll( ".ui-menu-item" ).each(function() {
2694                 item = $(
this );
2695                 
return item.offset().top - base - height < 0;
2696             });
2697
2698             
this.focus( event, item );
2699         }
else {
2700             
this.focus( event, this.activeMenu.find( this.options.items )
2701                 [ !
this.active ? "first" : "last" ]() );
2702         }
2703     },
2704
2705     previousPage: function(
event ) {
2706         
var item, base, height;
2707         
if ( !this.active ) {
2708             
this.next( event );
2709             
return;
2710         }
2711         
if ( this.isFirstItem() ) {
2712             
return;
2713         }
2714         
if ( this._hasScroll() ) {
2715             
base = this.active.offset().top;
2716             height =
this.element.height();
2717             
this.active.prevAll( ".ui-menu-item" ).each(function() {
2718                 item = $(
this );
2719                 
return item.offset().top - base + height > 0;
2720             });
2721
2722             
this.focus( event, item );
2723         }
else {
2724             
this.focus( event, this.activeMenu.find( this.options.items ).first() );
2725         }
2726     },
2727
2728     _hasScroll: function() {
2729         
return this.element.outerHeight() < this.element.prop( "scrollHeight" );
2730     },
2731
2732     
select: function( event ) {
2733         
// TODO: It should never be possible to not have an active item at this
2734         
// point, but the tests don't trigger mouseenter before click.
2735         
this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
2736         
var ui = { item: this.active };
2737         
if ( !this.active.has( ".ui-menu" ).length ) {
2738             
this.collapseAll( event, true );
2739         }
2740         
this._trigger( "select", event, ui );
2741     },
2742
2743     _filterMenuItems: function(character) {
2744         
var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
2745             regex =
new RegExp( "^" + escapedCharacter, "i" );
2746
2747         
return this.activeMenu
2748             .find(
this.options.items )
2749
2750             
// Only match on items, not dividers or other content (#10571)
2751             .filter(
".ui-menu-item" )
2752             .filter(function() {
2753                 
return regex.test( $.trim( $( this ).text() ) );
2754             });
2755     }
2756 });

2757
2758
2759 /*!
2760  * jQuery UI Autocomplete
1.11.4
2761  * http://jqueryui.com
2762  *
2763  * Copyright jQuery Foundation and other contributors
2764  * Released under the MIT license.
2765  * http://jquery.org/license
2766  *
2767  * http://api.jqueryui.com/autocomplete/
2768  */

2769
2770
2771 $.widget(
"ui.autocomplete", {
2772     version:
"1.11.4",
2773     defaultElement:
"<input>",
2774     options: {
2775         appendTo:
null,
2776         autoFocus:
false,
2777         delay:
300,
2778         minLength:
1,
2779         position: {
2780             my:
"left top",
2781             at:
"left bottom",
2782             collision:
"none"
2783         },
2784         source:
null,
2785
2786         
// callbacks
2787         change:
null,
2788         close:
null,
2789         focus:
null,
2790         open:
null,
2791         response:
null,
2792         search:
null,
2793         
select: null
2794     },
2795
2796     requestIndex:
0,
2797     pending:
0,
2798
2799     _create: function() {
2800         
// Some browsers only repeat keydown events, not keypress events,
2801         
// so we use the suppressKeyPress flag to determine if we've already
2802         
// handled the keydown event. #7269
2803         
// Unfortunately the code for & in keypress is the same as the up arrow,
2804         
// so we use the suppressKeyPressRepeat flag to avoid handling keypress
2805         
// events when we know the keydown event was used to modify the
2806         
// search term. #7799
2807         
var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
2808             nodeName =
this.element[ 0 ].nodeName.toLowerCase(),
2809             isTextarea = nodeName ===
"textarea",
2810             isInput = nodeName ===
"input";
2811
2812         
this.isMultiLine =
2813             
// Textareas are always multi-line
2814             isTextarea ?
true :
2815             
// Inputs are always single-line, even if inside a contentEditable element
2816             
// IE also treats inputs as contentEditable
2817             isInput ?
false :
2818             
// All other element types are determined by whether or not they're contentEditable
2819             
this.element.prop( "isContentEditable" );
2820
2821         
this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
2822         
this.isNewMenu = true;
2823
2824         
this.element
2825             .addClass(
"ui-autocomplete-input" )
2826             .attr(
"autocomplete", "off" );
2827
2828         
this._on( this.element, {
2829             keydown: function(
event ) {
2830                 
if ( this.element.prop( "readOnly" ) ) {
2831                     suppressKeyPress =
true;
2832                     suppressInput =
true;
2833                     suppressKeyPressRepeat =
true;
2834                     
return;
2835                 }
2836
2837                 suppressKeyPress =
false;
2838                 suppressInput =
false;
2839                 suppressKeyPressRepeat =
false;
2840                 
var keyCode = $.ui.keyCode;
2841                 
switch ( event.keyCode ) {
2842                 
case keyCode.PAGE_UP:
2843                     suppressKeyPress =
true;
2844                     
this._move( "previousPage", event );
2845                     
break;
2846                 
case keyCode.PAGE_DOWN:
2847                     suppressKeyPress =
true;
2848                     
this._move( "nextPage", event );
2849                     
break;
2850                 
case keyCode.UP:
2851                     suppressKeyPress =
true;
2852                     
this._keyEvent( "previous", event );
2853                     
break;
2854                 
case keyCode.DOWN:
2855                     suppressKeyPress =
true;
2856                     
this._keyEvent( "next", event );
2857                     
break;
2858                 
case keyCode.ENTER:
2859                     
// when menu is open and has focus
2860                     
if ( this.menu.active ) {
2861                         
// #6055 - Opera still allows the keypress to occur
2862                         
// which causes forms to submit
2863                         suppressKeyPress =
true;
2864                         
event.preventDefault();
2865                         
this.menu.select( event );
2866                     }
2867                     
break;
2868                 
case keyCode.TAB:
2869                     
if ( this.menu.active ) {
2870                         
this.menu.select( event );
2871                     }
2872                     
break;
2873                 
case keyCode.ESCAPE:
2874                     
if ( this.menu.element.is( ":visible" ) ) {
2875                         
if ( !this.isMultiLine ) {
2876                             
this._value( this.term );
2877                         }
2878                         
this.close( event );
2879                         
// Different browsers have different default behavior for escape
2880                         
// Single press can mean undo or clear
2881                         
// Double press in IE means clear the whole form
2882                         
event.preventDefault();
2883                     }
2884                     
break;
2885                 
default:
2886                     suppressKeyPressRepeat =
true;
2887                     
// search timeout should be triggered before the input value is changed
2888                     
this._searchTimeout( event );
2889                     
break;
2890                 }
2891             },
2892             keypress: function(
event ) {
2893                 
if ( suppressKeyPress ) {
2894                     suppressKeyPress =
false;
2895                     
if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
2896                         
event.preventDefault();
2897                     }
2898                     
return;
2899                 }
2900                 
if ( suppressKeyPressRepeat ) {
2901                     
return;
2902                 }
2903
2904                 
// replicate some key handlers to allow them to repeat in Firefox and Opera
2905                 
var keyCode = $.ui.keyCode;
2906                 
switch ( event.keyCode ) {
2907                 
case keyCode.PAGE_UP:
2908                     
this._move( "previousPage", event );
2909                     
break;
2910                 
case keyCode.PAGE_DOWN:
2911                     
this._move( "nextPage", event );
2912                     
break;
2913                 
case keyCode.UP:
2914                     
this._keyEvent( "previous", event );
2915                     
break;
2916                 
case keyCode.DOWN:
2917                     
this._keyEvent( "next", event );
2918                     
break;
2919                 }
2920             },
2921             input: function(
event ) {
2922                 
if ( suppressInput ) {
2923                     suppressInput =
false;
2924                     
event.preventDefault();
2925                     
return;
2926                 }
2927                 
this._searchTimeout( event );
2928             },
2929             focus: function() {
2930                 
this.selectedItem = null;
2931                 
this.previous = this._value();
2932             },
2933             blur: function(
event ) {
2934                 
if ( this.cancelBlur ) {
2935                     delete
this.cancelBlur;
2936                     
return;
2937                 }
2938
2939                 clearTimeout(
this.searching );
2940                 
this.close( event );
2941                 
this._change( event );
2942             }
2943         });
2944
2945         
this._initSource();
2946         
this.menu = $( "<ul>" )
2947             .addClass(
"ui-autocomplete ui-front" )
2948             .appendTo(
this._appendTo() )
2949             .menu({
2950                 
// disable ARIA support, the live region takes care of that
2951                 role:
null
2952             })
2953             .hide()
2954             .menu(
"instance" );
2955
2956         
this._on( this.menu.element, {
2957             mousedown: function(
event ) {
2958                 
// prevent moving focus out of the text field
2959                 
event.preventDefault();
2960
2961                 
// IE doesn't prevent moving focus even with event.preventDefault()
2962                 
// so we set a flag to know when we should ignore the blur event
2963                 
this.cancelBlur = true;
2964                 
this._delay(function() {
2965                     delete
this.cancelBlur;
2966                 });
2967
2968                 
// clicking on the scrollbar causes focus to shift to the body
2969                 
// but we can't detect a mouseup or a click immediately afterward
2970                 
// so we have to track the next mousedown and close the menu if
2971                 
// the user clicks somewhere outside of the autocomplete
2972                 
var menuElement = this.menu.element[ 0 ];
2973                 
if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
2974                     
this._delay(function() {
2975                         
var that = this;
2976                         
this.document.one( "mousedown", function( event ) {
2977                             
if ( event.target !== that.element[ 0 ] &&
2978                                     
event.target !== menuElement &&
2979                                     !$.contains( menuElement,
event.target ) ) {
2980                                 that.close();
2981                             }
2982                         });
2983                     });
2984                 }
2985             },
2986             menufocus: function(
event, ui ) {
2987                 
var label, item;
2988                 
// support: Firefox
2989                 
// Prevent accidental activation of menu items in Firefox (#7024 #9118)
2990                 
if ( this.isNewMenu ) {
2991                     
this.isNewMenu = false;
2992                     
if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
2993                         
this.menu.blur();
2994
2995                         
this.document.one( "mousemove", function() {
2996                             $(
event.target ).trigger( event.originalEvent );
2997                         });
2998
2999                         
return;
3000                     }
3001                 }
3002
3003                 item = ui.item.data(
"ui-autocomplete-item" );
3004                 
if ( false !== this._trigger( "focus", event, { item: item } ) ) {
3005                     
// use value to match what will end up in the input, if it was a key event
3006                     
if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
3007                         
this._value( item.value );
3008                     }
3009                 }
3010
3011                 
// Announce the value in the liveRegion
3012                 label = ui.item.attr(
"aria-label" ) || item.value;
3013                 
if ( label && $.trim( label ).length ) {
3014                     
this.liveRegion.children().hide();
3015                     $(
"<div>" ).text( label ).appendTo( this.liveRegion );
3016                 }
3017             },
3018             menuselect: function(
event, ui ) {
3019                 
var item = ui.item.data( "ui-autocomplete-item" ),
3020                     previous =
this.previous;
3021
3022                 
// only trigger when focus was lost (click on menu)
3023                 
if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
3024                     
this.element.focus();
3025                     
this.previous = previous;
3026                     
// #6109 - IE triggers two focus events and the second
3027                     
// is asynchronous, so we need to reset the previous
3028                     
// term synchronously and asynchronously :-(
3029                     
this._delay(function() {
3030                         
this.previous = previous;
3031                         
this.selectedItem = item;
3032                     });
3033                 }
3034
3035                 
if ( false !== this._trigger( "select", event, { item: item } ) ) {
3036                     
this._value( item.value );
3037                 }
3038                 
// reset the term after the select event
3039                 
// this allows custom select handling to work properly
3040                 
this.term = this._value();
3041
3042                 
this.close( event );
3043                 
this.selectedItem = item;
3044             }
3045         });
3046
3047         
this.liveRegion = $( "<span>", {
3048                 role:
"status",
3049                 
"aria-live": "assertive",
3050                 
"aria-relevant": "additions"
3051             })
3052             .addClass(
"ui-helper-hidden-accessible" )
3053             .appendTo(
this.document[ 0 ].body );
3054
3055         
// turning off autocomplete prevents the browser from remembering the
3056         
// value when navigating through history, so we re-enable autocomplete
3057         
// if the page is unloaded before the widget is destroyed. #7790
3058         
this._on( this.window, {
3059             beforeunload: function() {
3060                 
this.element.removeAttr( "autocomplete" );
3061             }
3062         });
3063     },
3064
3065     _destroy: function() {
3066         clearTimeout(
this.searching );
3067         
this.element
3068             .removeClass(
"ui-autocomplete-input" )
3069             .removeAttr(
"autocomplete" );
3070         
this.menu.element.remove();
3071         
this.liveRegion.remove();
3072     },
3073
3074     _setOption: function( key,
value ) {
3075         
this._super( key, value );
3076         
if ( key === "source" ) {
3077             
this._initSource();
3078         }
3079         
if ( key === "appendTo" ) {
3080             
this.menu.element.appendTo( this._appendTo() );
3081         }
3082         
if ( key === "disabled" && value && this.xhr ) {
3083             
this.xhr.abort();
3084         }
3085     },
3086
3087     _appendTo: function() {
3088         
var element = this.options.appendTo;
3089
3090         
if ( element ) {
3091             element = element.jquery || element.nodeType ?
3092                 $( element ) :
3093                 
this.document.find( element ).eq( 0 );
3094         }
3095
3096         
if ( !element || !element[ 0 ] ) {
3097             element =
this.element.closest( ".ui-front" );
3098         }
3099
3100         
if ( !element.length ) {
3101             element =
this.document[ 0 ].body;
3102         }
3103
3104         
return element;
3105     },
3106
3107     _initSource: function() {
3108         
var array, url,
3109             that =
this;
3110         
if ( $.isArray( this.options.source ) ) {
3111             array =
this.options.source;
3112             
this.source = function( request, response ) {
3113                 response( $.ui.autocomplete.filter( array, request.term ) );
3114             };
3115         }
else if ( typeof this.options.source === "string" ) {
3116             url =
this.options.source;
3117             
this.source = function( request, response ) {
3118                 
if ( that.xhr ) {
3119                     that.xhr.abort();
3120                 }
3121                 that.xhr = $.ajax({
3122                     url: url,
3123                     data: request,
3124                     dataType:
"json",
3125                     success: function( data ) {
3126                         response( data );
3127                     },
3128                     error: function() {
3129                         response([]);
3130                     }
3131                 });
3132             };
3133         }
else {
3134             
this.source = this.options.source;
3135         }
3136     },
3137
3138     _searchTimeout: function(
event ) {
3139         clearTimeout(
this.searching );
3140         
this.searching = this._delay(function() {
3141
3142             
// Search if the value has changed, or if the user retypes the same value (see #7434)
3143             
var equalValues = this.term === this._value(),
3144                 menuVisible =
this.menu.element.is( ":visible" ),
3145                 modifierKey =
event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
3146
3147             
if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
3148                 
this.selectedItem = null;
3149                 
this.search( null, event );
3150             }
3151         },
this.options.delay );
3152     },
3153
3154     search: function(
value, event ) {
3155         
value = value != null ? value : this._value();
3156
3157         
// always save the actual value, not the one passed as an argument
3158         
this.term = this._value();
3159
3160         
if ( value.length < this.options.minLength ) {
3161             
return this.close( event );
3162         }
3163
3164         
if ( this._trigger( "search", event ) === false ) {
3165             
return;
3166         }
3167
3168         
return this._search( value );
3169     },
3170
3171     _search: function(
value ) {
3172         
this.pending++;
3173         
this.element.addClass( "ui-autocomplete-loading" );
3174         
this.cancelSearch = false;
3175
3176         
this.source( { term: value }, this._response() );
3177     },
3178
3179     _response: function() {
3180         
var index = ++this.requestIndex;
3181
3182         
return $.proxy(function( content ) {
3183             
if ( index === this.requestIndex ) {
3184                 
this.__response( content );
3185             }
3186
3187             
this.pending--;
3188             
if ( !this.pending ) {
3189                 
this.element.removeClass( "ui-autocomplete-loading" );
3190             }
3191         },
this );
3192     },
3193
3194     __response: function( content ) {
3195         
if ( content ) {
3196             content =
this._normalize( content );
3197         }
3198         
this._trigger( "response", null, { content: content } );
3199         
if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
3200             
this._suggest( content );
3201             
this._trigger( "open" );
3202         }
else {
3203             
// use ._close() instead of .close() so we don't cancel future searches
3204             
this._close();
3205         }
3206     },
3207
3208     close: function(
event ) {
3209         
this.cancelSearch = true;
3210         
this._close( event );
3211     },
3212
3213     _close: function(
event ) {
3214         
if ( this.menu.element.is( ":visible" ) ) {
3215             
this.menu.element.hide();
3216             
this.menu.blur();
3217             
this.isNewMenu = true;
3218             
this._trigger( "close", event );
3219         }
3220     },
3221
3222     _change: function(
event ) {
3223         
if ( this.previous !== this._value() ) {
3224             
this._trigger( "change", event, { item: this.selectedItem } );
3225         }
3226     },
3227
3228     _normalize: function( items ) {
3229         
// assume all items have the right format when the first item is complete
3230         
if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
3231             
return items;
3232         }
3233         
return $.map( items, function( item ) {
3234             
if ( typeof item === "string" ) {
3235                 
return {
3236                     label: item,
3237                     
value: item
3238                 };
3239             }
3240             
return $.extend( {}, item, {
3241                 label: item.label || item.
value,
3242                 
value: item.value || item.label
3243             });
3244         });
3245     },
3246
3247     _suggest: function( items ) {
3248         
var ul = this.menu.element.empty();
3249         
this._renderMenu( ul, items );
3250         
this.isNewMenu = true;
3251         
this.menu.refresh();
3252
3253         
// size and position menu
3254         ul.show();
3255         
this._resizeMenu();
3256         ul.position( $.extend({
3257             of:
this.element
3258         },
this.options.position ) );
3259
3260         
if ( this.options.autoFocus ) {
3261             
this.menu.next();
3262         }
3263     },
3264
3265     _resizeMenu: function() {
3266         
var ul = this.menu.element;
3267         ul.outerWidth( Math.max(
3268             
// Firefox wraps long text (possibly a rounding bug)
3269             
// so we add 1px to avoid the wrapping (#7513)
3270             ul.width(
"" ).outerWidth() + 1,
3271             
this.element.outerWidth()
3272         ) );
3273     },
3274
3275     _renderMenu: function( ul, items ) {
3276         
var that = this;
3277         $.each( items, function( index, item ) {
3278             that._renderItemData( ul, item );
3279         });
3280     },
3281
3282     _renderItemData: function( ul, item ) {
3283         
return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
3284     },
3285
3286     _renderItem: function( ul, item ) {
3287         
return $( "<li>" ).text( item.label ).appendTo( ul );
3288     },
3289
3290     _move: function( direction,
event ) {
3291         
if ( !this.menu.element.is( ":visible" ) ) {
3292             
this.search( null, event );
3293             
return;
3294         }
3295         
if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
3296                 
this.menu.isLastItem() && /^next/.test( direction ) ) {
3297
3298             
if ( !this.isMultiLine ) {
3299                 
this._value( this.term );
3300             }
3301
3302             
this.menu.blur();
3303             
return;
3304         }
3305         
this.menu[ direction ]( event );
3306     },
3307
3308     widget: function() {
3309         
return this.menu.element;
3310     },
3311
3312     _value: function() {
3313         
return this.valueMethod.apply( this.element, arguments );
3314     },
3315
3316     _keyEvent: function( keyEvent,
event ) {
3317         
if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
3318             
this._move( keyEvent, event );
3319
3320             
// prevents moving cursor to beginning/end of the text field in some browsers
3321             
event.preventDefault();
3322         }
3323     }
3324 });
3325
3326 $.extend( $.ui.autocomplete, {
3327     escapeRegex: function(
value ) {
3328         
return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
3329     },
3330     filter: function( array, term ) {
3331         
var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
3332         
return $.grep( array, function( value ) {
3333             
return matcher.test( value.label || value.value || value );
3334         });
3335     }
3336 });

3337
3338 // live region extension, adding a `messages` option
3339 // NOTE: This
is an experimental API. We are still investigating
3340 // a full solution
for string manipulation and internationalization.
3341 $.widget(
"ui.autocomplete", $.ui.autocomplete, {
3342     options: {
3343         messages: {
3344             noResults:
"No search results.",
3345             results: function( amount ) {
3346                 
return amount + ( amount > 1 ? " results are" : " result is" ) +
3347                     
" available, use up and down arrow keys to navigate.";
3348             }
3349         }
3350     },
3351
3352     __response: function( content ) {
3353         
var message;
3354         
this._superApply( arguments );
3355         
if ( this.options.disabled || this.cancelSearch ) {
3356             
return;
3357         }
3358         
if ( content && content.length ) {
3359             message =
this.options.messages.results( content.length );
3360         }
else {
3361             message =
this.options.messages.noResults;
3362         }
3363         
this.liveRegion.children().hide();
3364         $(
"<div>" ).text( message ).appendTo( this.liveRegion );
3365     }
3366 });

3367
3368 var
autocomplete = $.ui.autocomplete;
3369
3370
3371 /*!
3372  * jQuery UI Button
1.11.4
3373  * http://jqueryui.com
3374  *
3375  * Copyright jQuery Foundation and other contributors
3376  * Released under the MIT license.
3377  * http://jquery.org/license
3378  *
3379  * http://api.jqueryui.com/button/
3380  */

3381
3382
3383 var
lastActive,
3384     baseClasses =
"ui-button ui-widget ui-state-default ui-corner-all",
3385     typeClasses =
"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
3386     formResetHandler = function() {
3387         
var form = $( this );
3388         setTimeout(function() {
3389             form.find(
":ui-button" ).button( "refresh" );
3390         },
1 );
3391     },
3392     radioGroup = function( radio ) {
3393         
var name = radio.name,
3394             form = radio.form,
3395             radios = $( [] );
3396         
if ( name ) {
3397             name = name.replace( /
'/g, "\\'" );
3398             
if ( form ) {
3399                 radios = $( form ).find( "
[name='" + name + "'][type=radio]" );
3400             }
else {
3401                 radios = $( "
[name='" + name + "'][type=radio]", radio.ownerDocument )
3402                     .filter(function() {
3403                         
return !this.form;
3404                     });
3405             }
3406         }
3407         
return radios;
3408     };
3409
3410 $.widget( "
ui.button", {
3411     version: "
1.11.4",
3412     defaultElement: "
<button>",
3413     options: {
3414         disabled:
null,
3415         text:
true,
3416         label:
null,
3417         icons: {
3418             primary:
null,
3419             secondary:
null
3420         }
3421     },
3422     _create: function() {
3423         
this.element.closest( "form" )
3424             .unbind( "
reset" + this.eventNamespace )
3425             .bind( "
reset" + this.eventNamespace, formResetHandler );
3426
3427         
if ( typeof this.options.disabled !== "boolean" ) {
3428             
this.options.disabled = !!this.element.prop( "disabled" );
3429         }
else {
3430             
this.element.prop( "disabled", this.options.disabled );
3431         }
3432
3433         
this._determineButtonType();
3434         
this.hasTitle = !!this.buttonElement.attr( "title" );
3435
3436         
var that = this,
3437             options =
this.options,
3438             toggleButton =
this.type === "checkbox" || this.type === "radio",
3439             activeClass = !toggleButton ? "
ui-state-active" : "";
3440
3441         
if ( options.label === null ) {
3442             options.label = (
this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
3443         }
3444
3445         
this._hoverable( this.buttonElement );
3446
3447         
this.buttonElement
3448             .addClass( baseClasses )
3449             .attr( "
role", "button" )
3450             .bind( "
mouseenter" + this.eventNamespace, function() {
3451                 
if ( options.disabled ) {
3452                     
return;
3453                 }
3454                 
if ( this === lastActive ) {
3455                     $(
this ).addClass( "ui-state-active" );
3456                 }
3457             })
3458             .bind( "
mouseleave" + this.eventNamespace, function() {
3459                 
if ( options.disabled ) {
3460                     
return;
3461                 }
3462                 $(
this ).removeClass( activeClass );
3463             })
3464             .bind( "
click" + this.eventNamespace, function( event ) {
3465                 
if ( options.disabled ) {
3466                     
event.preventDefault();
3467                     
event.stopImmediatePropagation();
3468                 }
3469             });
3470
3471         
// Can't use _focusable() because the element that receives focus
3472         
// and the element that gets the ui-state-focus class are different
3473         
this._on({
3474             focus: function() {
3475                 
this.buttonElement.addClass( "ui-state-focus" );
3476             },
3477             blur: function() {
3478                 
this.buttonElement.removeClass( "ui-state-focus" );
3479             }
3480         });
3481
3482         
if ( toggleButton ) {
3483             
this.element.bind( "change" + this.eventNamespace, function() {
3484                 that.refresh();
3485             });
3486         }
3487
3488         
if ( this.type === "checkbox" ) {
3489             
this.buttonElement.bind( "click" + this.eventNamespace, function() {
3490                 
if ( options.disabled ) {
3491                     
return false;
3492                 }
3493             });
3494         }
else if ( this.type === "radio" ) {
3495             
this.buttonElement.bind( "click" + this.eventNamespace, function() {
3496                 
if ( options.disabled ) {
3497                     
return false;
3498                 }
3499                 $(
this ).addClass( "ui-state-active" );
3500                 that.buttonElement.attr( "
aria-pressed", "true" );
3501
3502                 
var radio = that.element[ 0 ];
3503                 radioGroup( radio )
3504                     .not( radio )
3505                     .map(function() {
3506                         
return $( this ).button( "widget" )[ 0 ];
3507                     })
3508                     .removeClass( "
ui-state-active" )
3509                     .attr( "
aria-pressed", "false" );
3510             });
3511         }
else {
3512             
this.buttonElement
3513                 .bind( "
mousedown" + this.eventNamespace, function() {
3514                     
if ( options.disabled ) {
3515                         
return false;
3516                     }
3517                     $(
this ).addClass( "ui-state-active" );
3518                     lastActive =
this;
3519                     that.document.one( "
mouseup", function() {
3520                         lastActive =
null;
3521                     });
3522                 })
3523                 .bind( "
mouseup" + this.eventNamespace, function() {
3524                     
if ( options.disabled ) {
3525                         
return false;
3526                     }
3527                     $(
this ).removeClass( "ui-state-active" );
3528                 })
3529                 .bind( "
keydown" + this.eventNamespace, function(event) {
3530                     
if ( options.disabled ) {
3531                         
return false;
3532                     }
3533                     
if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
3534                         $(
this ).addClass( "ui-state-active" );
3535                     }
3536                 })
3537                 
// see #8559, we bind to blur here in case the button element loses
3538                 
// focus between keydown and keyup, it would be left in an "active" state
3539                 .bind( "
keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
3540                     $(
this ).removeClass( "ui-state-active" );
3541                 });
3542
3543             
if ( this.buttonElement.is("a") ) {
3544                 
this.buttonElement.keyup(function(event) {
3545                     
if ( event.keyCode === $.ui.keyCode.SPACE ) {
3546                         
// TODO pass through original event correctly (just as 2nd argument doesn't work)
3547                         $(
this ).click();
3548                     }
3549                 });
3550             }
3551         }
3552
3553         
this._setOption( "disabled", options.disabled );
3554         
this._resetButton();
3555     },
3556
3557     _determineButtonType: function() {
3558         
var ancestor, labelSelector, checked;
3559
3560         
if ( this.element.is("[type=checkbox]") ) {
3561             
this.type = "checkbox";
3562         }
else if ( this.element.is("[type=radio]") ) {
3563             
this.type = "radio";
3564         }
else if ( this.element.is("input") ) {
3565             
this.type = "input";
3566         }
else {
3567             
this.type = "button";
3568         }
3569
3570         
if ( this.type === "checkbox" || this.type === "radio" ) {
3571             
// we don't search against the document in case the element
3572             
// is disconnected from the DOM
3573             ancestor =
this.element.parents().last();
3574             labelSelector = "
label[for='" + this.element.attr("id") + "']";
3575             
this.buttonElement = ancestor.find( labelSelector );
3576             
if ( !this.buttonElement.length ) {
3577                 ancestor = ancestor.length ? ancestor.siblings() :
this.element.siblings();
3578                 
this.buttonElement = ancestor.filter( labelSelector );
3579                 
if ( !this.buttonElement.length ) {
3580                     
this.buttonElement = ancestor.find( labelSelector );
3581                 }
3582             }
3583             
this.element.addClass( "ui-helper-hidden-accessible" );
3584
3585             
checked = this.element.is( ":checked" );
3586             
if ( checked ) {
3587                 
this.buttonElement.addClass( "ui-state-active" );
3588             }
3589             
this.buttonElement.prop( "aria-pressed", checked );
3590         }
else {
3591             
this.buttonElement = this.element;
3592         }
3593     },
3594
3595     widget: function() {
3596         
return this.buttonElement;
3597     },
3598
3599     _destroy: function() {
3600         
this.element
3601             .removeClass( "
ui-helper-hidden-accessible" );
3602         
this.buttonElement
3603             .removeClass( baseClasses + "
ui-state-active " + typeClasses )
3604             .removeAttr( "
role" )
3605             .removeAttr( "
aria-pressed" )
3606             .html(
this.buttonElement.find(".ui-button-text").html() );
3607
3608         
if ( !this.hasTitle ) {
3609             
this.buttonElement.removeAttr( "title" );
3610         }
3611     },
3612
3613     _setOption: function( key,
value ) {
3614         
this._super( key, value );
3615         
if ( key === "disabled" ) {
3616             
this.widget().toggleClass( "ui-state-disabled", !!value );
3617             
this.element.prop( "disabled", !!value );
3618             
if ( value ) {
3619                 
if ( this.type === "checkbox" || this.type === "radio" ) {
3620                     
this.buttonElement.removeClass( "ui-state-focus" );
3621                 }
else {
3622                     
this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
3623                 }
3624             }
3625             
return;
3626         }
3627         
this._resetButton();
3628     },
3629
3630     refresh: function() {
3631         
//See #8237 & #8828
3632         
var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
3633
3634         
if ( isDisabled !== this.options.disabled ) {
3635             
this._setOption( "disabled", isDisabled );
3636         }
3637         
if ( this.type === "radio" ) {
3638             radioGroup(
this.element[0] ).each(function() {
3639                 
if ( $( this ).is( ":checked" ) ) {
3640                     $(
this ).button( "widget" )
3641                         .addClass( "
ui-state-active" )
3642                         .attr( "
aria-pressed", "true" );
3643                 }
else {
3644                     $(
this ).button( "widget" )
3645                         .removeClass( "
ui-state-active" )
3646                         .attr( "
aria-pressed", "false" );
3647                 }
3648             });
3649         }
else if ( this.type === "checkbox" ) {
3650             
if ( this.element.is( ":checked" ) ) {
3651                 
this.buttonElement
3652                     .addClass( "
ui-state-active" )
3653                     .attr( "
aria-pressed", "true" );
3654             }
else {
3655                 
this.buttonElement
3656                     .removeClass( "
ui-state-active" )
3657                     .attr( "
aria-pressed", "false" );
3658             }
3659         }
3660     },
3661
3662     _resetButton: function() {
3663         
if ( this.type === "input" ) {
3664             
if ( this.options.label ) {
3665                 
this.element.val( this.options.label );
3666             }
3667             
return;
3668         }
3669         
var buttonElement = this.buttonElement.removeClass( typeClasses ),
3670             buttonText = $( "
<span></span>", this.document[0] )
3671                 .addClass( "
ui-button-text" )
3672                 .html(
this.options.label )
3673                 .appendTo( buttonElement.empty() )
3674                 .text(),
3675             icons =
this.options.icons,
3676             multipleIcons = icons.primary && icons.secondary,
3677             buttonClasses = [];
3678
3679         
if ( icons.primary || icons.secondary ) {
3680             
if ( this.options.text ) {
3681                 buttonClasses.push( "
ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
3682             }
3683
3684             
if ( icons.primary ) {
3685                 buttonElement.prepend( "
<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
3686             }
3687
3688             
if ( icons.secondary ) {
3689                 buttonElement.append( "
<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
3690             }
3691
3692             
if ( !this.options.text ) {
3693                 buttonClasses.push( multipleIcons ? "
ui-button-icons-only" : "ui-button-icon-only" );
3694
3695                 
if ( !this.hasTitle ) {
3696                     buttonElement.attr( "
title", $.trim( buttonText ) );
3697                 }
3698             }
3699         }
else {
3700             buttonClasses.push( "
ui-button-text-only" );
3701         }
3702         buttonElement.addClass( buttonClasses.
join( " " ) );
3703     }
3704 });
3705
3706 $.widget( "
ui.buttonset", {
3707     version: "
1.11.4",
3708     options: {
3709         items: "
button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
3710     },
3711
3712     _create: function() {
3713         
this.element.addClass( "ui-buttonset" );
3714     },
3715
3716     _init: function() {
3717         
this.refresh();
3718     },
3719
3720     _setOption: function( key,
value ) {
3721         
if ( key === "disabled" ) {
3722             
this.buttons.button( "option", key, value );
3723         }
3724
3725         
this._super( key, value );
3726     },
3727
3728     refresh: function() {
3729         
var rtl = this.element.css( "direction" ) === "rtl",
3730             allButtons =
this.element.find( this.options.items ),
3731             existingButtons = allButtons.filter( "
:ui-button" );
3732
3733         
// Initialize new buttons
3734         allButtons.not( "
:ui-button" ).button();
3735
3736         
// Refresh existing buttons
3737         existingButtons.button( "
refresh" );
3738
3739         
this.buttons = allButtons
3740             .map(function() {
3741                 
return $( this ).button( "widget" )[ 0 ];
3742             })
3743                 .removeClass( "
ui-corner-all ui-corner-left ui-corner-right" )
3744                 .filter( "
:first" )
3745                     .addClass( rtl ? "
ui-corner-right" : "ui-corner-left" )
3746                 .end()
3747                 .filter( "
:last" )
3748                     .addClass( rtl ? "
ui-corner-left" : "ui-corner-right" )
3749                 .end()
3750             .end();
3751     },
3752
3753     _destroy: function() {
3754         
this.element.removeClass( "ui-buttonset" );
3755         
this.buttons
3756             .map(function() {
3757                 
return $( this ).button( "widget" )[ 0 ];
3758             })
3759                 .removeClass( "
ui-corner-left ui-corner-right" )
3760             .end()
3761             .button( "
destroy" );
3762     }
3763 });

3764
3765 var
button = $.ui.button;
3766
3767
3768 /*!
3769  * jQuery UI Datepicker
1.11.4
3770  * http://jqueryui.com
3771  *
3772  * Copyright jQuery Foundation and other contributors
3773  * Released under the MIT license.
3774  * http://jquery.org/license
3775  *
3776  * http://api.jqueryui.com/datepicker/
3777  */

3778
3779
3780 $.extend($.ui, { datepicker: { version: "
1.11.4" } });
3781
3782 var
datepicker_instActive;
3783
3784 function datepicker_getZindex( elem ) {
3785     
var position, value;
3786     
while ( elem.length && elem[ 0 ] !== document ) {
3787         
// Ignore z-index if position is set to a value where z-index is ignored by the browser
3788         
// This makes behavior of this function consistent across browsers
3789         
// WebKit always returns auto if the element is positioned
3790         position = elem.css( "
position" );
3791         
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
3792             
// IE returns 0 when zIndex is not specified
3793             
// other browsers return a string
3794             
// we ignore the case of nested elements with an explicit value of 0
3795             
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
3796             
value = parseInt( elem.css( "zIndex" ), 10 );
3797             
if ( !isNaN( value ) && value !== 0 ) {
3798                 
return value;
3799             }
3800         }
3801         elem = elem.parent();
3802     }
3803
3804     
return 0;
3805 }

3806 /* Date picker manager.
3807    Use the singleton instance of
this class, $.datepicker, to interact with the date picker.
3808    Settings
for (groups of) date pickers are maintained in an instance object,
3809    allowing multiple different settings
on the same page. */
3810
3811 function Datepicker() {
3812     
this._curInst = null; // The current instance in use
3813     
this._keyEvent = false; // If the last event was a key event
3814     
this._disabledInputs = []; // List of date picker inputs that have been disabled
3815     
this._datepickerShowing = false; // True if the popup picker is showing , false if not
3816     
this._inDialog = false; // True if showing within a "dialog", false if not
3817     
this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
3818     
this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
3819     
this._appendClass = "ui-datepicker-append"; // The name of the append marker class
3820     
this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
3821     
this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
3822     
this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
3823     
this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
3824     
this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
3825     
this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
3826     
this.regional = []; // Available regional settings, indexed by language code
3827     
this.regional[""] = { // Default regional settings
3828         closeText: "
Done", // Display text for close link
3829         prevText: "
Prev", // Display text for previous month link
3830         nextText: "
Next", // Display text for next month link
3831         currentText: "
Today", // Display text for current month link
3832         monthNames: ["
January","February","March","April","May","June",
3833             "
July","August","September","October","November","December"], // Names of months for drop-down and formatting
3834         monthNamesShort: ["
Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
3835         dayNames: ["
Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
3836         dayNamesShort: ["
Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
3837         dayNamesMin: ["
Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
3838         weekHeader: "
Wk", // Column header for week of the year
3839         dateFormat: "
mm/dd/yy", // See format options on parseDate
3840         firstDay:
0, // The first day of the week, Sun = 0, Mon = 1, ...
3841         isRTL:
false, // True if right-to-left language, false if left-to-right
3842         showMonthAfterYear:
false, // True if the year select precedes month, false for month then year
3843         yearSuffix: ""
// Additional text to append to the year in the month headers
3844     };
3845     
this._defaults = { // Global defaults for all the date picker instances
3846         showOn: "
focus", // "focus" for popup on focus,
3847             
// "button" for trigger button, or "both" for either
3848         showAnim: "
fadeIn", // Name of jQuery animation for popup
3849         showOptions: {},
// Options for enhanced animations
3850         defaultDate:
null, // Used when field is blank: actual date,
3851             
// +/-number for offset from today, null for today
3852         appendText: "",
// Display text following the input box, e.g. showing the format
3853         buttonText: "
...", // Text for trigger button
3854         buttonImage: "",
// URL for trigger button image
3855         buttonImageOnly:
false, // True if the image appears alone, false if it appears on a button
3856         hideIfNoPrevNext:
false, // True to hide next/previous month links
3857             
// if not applicable, false to just disable them
3858         navigationAsDateFormat:
false, // True if date formatting applied to prev/today/next links
3859         gotoCurrent:
false, // True if today link goes back to current selection instead
3860         changeMonth:
false, // True if month can be selected directly, false if only prev/next
3861         changeYear:
false, // True if year can be selected directly, false if only prev/next
3862         yearRange: "
c-10:c+10", // Range of years to display in drop-down,
3863             
// either relative to today's year (-nn:+nn), relative to currently displayed year
3864             
// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
3865         showOtherMonths:
false, // True to show dates in other months, false to leave blank
3866         selectOtherMonths:
false, // True to allow selection of dates in other months, false for unselectable
3867         showWeek:
false, // True to show week of the year, false to not show it
3868         calculateWeek:
this.iso8601Week, // How to calculate the week of the year,
3869             
// takes a Date and returns the number of the week for it
3870         shortYearCutoff: "
+10", // Short year values < this are in the current century,
3871             
// > this are in the previous century,
3872             
// string value starting with "+" for current year + value
3873         minDate:
null, // The earliest selectable date, or null for no limit
3874         maxDate:
null, // The latest selectable date, or null for no limit
3875         duration: "
fast", // Duration of display/closure
3876         beforeShowDay:
null, // Function that takes a date and returns an array with
3877             
// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
3878             
// [2] = cell title (optional), e.g. $.datepicker.noWeekends
3879         beforeShow:
null, // Function that takes an input field and
3880             
// returns a set of custom settings for the date picker
3881         onSelect:
null, // Define a callback function when a date is selected
3882         onChangeMonthYear:
null, // Define a callback function when the month or year is changed
3883         onClose:
null, // Define a callback function when the datepicker is closed
3884         numberOfMonths:
1, // Number of months to show at a time
3885         showCurrentAtPos:
0, // The position in multipe months at which to show the current month (starting at 0)
3886         stepMonths:
1, // Number of months to step back/forward
3887         stepBigMonths:
12, // Number of months to step back/forward for the big links
3888         altField: "",
// Selector for an alternate field to store selected dates into
3889         altFormat: "",
// The date format to use for the alternate field
3890         constrainInput:
true, // The input is constrained by the current date format
3891         showButtonPanel:
false, // True to show button panel, false to not show it
3892         autoSize:
false, // True to size the input for the date format, false to leave as is
3893         disabled:
false // The initial disabled state
3894     };
3895     $.extend(
this._defaults, this.regional[""]);
3896     
this.regional.en = $.extend( true, {}, this.regional[ "" ]);
3897     
this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
3898     
this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
3899 }
3900
3901 $.extend(Datepicker.prototype, {
3902     
/* Class name added to elements to indicate already configured with a date picker. */
3903     markerClassName: "
hasDatepicker",
3904
3905     
//Keep track of the maximum number of rows displayed (see #7043)
3906     maxRows:
4,
3907
3908     
// TODO rename to "widget" when switching to widget factory
3909     _widgetDatepicker: function() {
3910         
return this.dpDiv;
3911     },
3912
3913     
/* Override the default settings for all instances of the date picker.
3914      * @param settings
object - the new settings to use as defaults (anonymous object)
3915      * @
return the manager object
3916      */

3917     setDefaults: function(settings) {
3918         datepicker_extendRemove(
this._defaults, settings || {});
3919         
return this;
3920     },
3921
3922     
/* Attach the date picker to a jQuery selection.
3923      * @param target element - the target input field or division or span
3924      * @param settings
object - the new settings to use for this date picker instance (anonymous)
3925      */

3926     _attachDatepicker: function(target, settings) {
3927         
var nodeName, inline, inst;
3928         nodeName = target.nodeName.toLowerCase();
3929         inline = (nodeName === "
div" || nodeName === "span");
3930         
if (!target.id) {
3931             
this.uuid += 1;
3932             target.id = "
dp" + this.uuid;
3933         }
3934         inst =
this._newInst($(target), inline);
3935         inst.settings = $.extend({}, settings || {});
3936         
if (nodeName === "input") {
3937             
this._connectDatepicker(target, inst);
3938         }
else if (inline) {
3939             
this._inlineDatepicker(target, inst);
3940         }
3941     },
3942
3943     
/* Create a new instance object. */
3944     _newInst: function(target, inline) {
3945         
var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
3946         
return {id: id, input: target, // associated target
3947             selectedDay:
0, selectedMonth: 0, selectedYear: 0, // current selection
3948             drawMonth:
0, drawYear: 0, // month being drawn
3949             inline: inline,
// is datepicker inline or not
3950             dpDiv: (!inline ?
this.dpDiv : // presentation div
3951             datepicker_bindHover($("
<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
3952     },
3953
3954     
/* Attach the date picker to an input field. */
3955     _connectDatepicker: function(target, inst) {
3956         
var input = $(target);
3957         inst.append = $([]);
3958         inst.trigger = $([]);
3959         
if (input.hasClass(this.markerClassName)) {
3960             
return;
3961         }
3962         
this._attachments(input, inst);
3963         input.addClass(
this.markerClassName).keydown(this._doKeyDown).
3964             keypress(
this._doKeyPress).keyup(this._doKeyUp);
3965         
this._autoSize(inst);
3966         $.data(target, "
datepicker", inst);
3967         
//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
3968         
if( inst.settings.disabled ) {
3969             
this._disableDatepicker( target );
3970         }
3971     },
3972
3973     
/* Make attachments based on settings. */
3974     _attachments: function(input, inst) {
3975         
var showOn, buttonText, buttonImage,
3976             appendText =
this._get(inst, "appendText"),
3977             isRTL =
this._get(inst, "isRTL");
3978
3979         
if (inst.append) {
3980             inst.append.
remove();
3981         }
3982         
if (appendText) {
3983             inst.append = $("
<span class='" + this._appendClass + "'>" + appendText + "</span>");
3984             input[isRTL ? "
before" : "after"](inst.append);
3985         }
3986
3987         input.unbind("
focus", this._showDatepicker);
3988
3989         
if (inst.trigger) {
3990             inst.trigger.
remove();
3991         }
3992
3993         showOn =
this._get(inst, "showOn");
3994         
if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
3995             input.focus(
this._showDatepicker);
3996         }
3997         
if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
3998             buttonText =
this._get(inst, "buttonText");
3999             buttonImage =
this._get(inst, "buttonImage");
4000             inst.trigger = $(
this._get(inst, "buttonImageOnly") ?
4001                 $("
<img/>").addClass(this._triggerClass).
4002                     attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
4003                 $("
<button type='button'></button>").addClass(this._triggerClass).
4004                     html(!buttonImage ? buttonText : $("
<img/>").attr(
4005                     { src:buttonImage, alt:buttonText, title:buttonText })));
4006             input[isRTL ? "
before" : "after"](inst.trigger);
4007             inst.trigger.click(function() {
4008                 
if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
4009                     $.datepicker._hideDatepicker();
4010                 }
else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
4011                     $.datepicker._hideDatepicker();
4012                     $.datepicker._showDatepicker(input[
0]);
4013                 }
else {
4014                     $.datepicker._showDatepicker(input[
0]);
4015                 }
4016                 
return false;
4017             });
4018         }
4019     },
4020
4021     
/* Apply the maximum length for the date format. */
4022     _autoSize: function(inst) {
4023         
if (this._get(inst, "autoSize") && !inst.inline) {
4024             
var findMax, max, maxI, i,
4025                 date =
new Date(2009, 12 - 1, 20), // Ensure double digits
4026                 dateFormat =
this._get(inst, "dateFormat");
4027
4028             
if (dateFormat.match(/[DM]/)) {
4029                 findMax = function(names) {
4030                     max =
0;
4031                     maxI =
0;
4032                     
for (i = 0; i < names.length; i++) {
4033                         
if (names[i].length > max) {
4034                             max = names[i].length;
4035                             maxI = i;
4036                         }
4037                     }
4038                     
return maxI;
4039                 };
4040                 date.setMonth(findMax(
this._get(inst, (dateFormat.match(/MM/) ?
4041                     "
monthNames" : "monthNamesShort"))));
4042                 date.setDate(findMax(
this._get(inst, (dateFormat.match(/DD/) ?
4043                     "
dayNames" : "dayNamesShort"))) + 20 - date.getDay());
4044             }
4045             inst.input.attr("
size", this._formatDate(inst, date).length);
4046         }
4047     },
4048
4049     
/* Attach an inline date picker to a div. */
4050     _inlineDatepicker: function(target, inst) {
4051         
var divSpan = $(target);
4052         
if (divSpan.hasClass(this.markerClassName)) {
4053             
return;
4054         }
4055         divSpan.addClass(
this.markerClassName).append(inst.dpDiv);
4056         $.data(target, "
datepicker", inst);
4057         
this._setDate(inst, this._getDefaultDate(inst), true);
4058         
this._updateDatepicker(inst);
4059         
this._updateAlternate(inst);
4060         
//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
4061         
if( inst.settings.disabled ) {
4062             
this._disableDatepicker( target );
4063         }
4064         
// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
4065         
// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
4066         inst.dpDiv.css( "
display", "block" );
4067     },
4068
4069     
/* Pop-up the date picker in a "dialog" box.
4070      * @param input element - ignored
4071      * @param date
string or Date - the initial date to display
4072      * @param onSelect function - the function to call
when a date is selected
4073      * @param settings
object - update the dialog date picker instance's settings (anonymous object)
4074      * @param pos
int[2] - coordinates for the dialog's position within the screen or
4075      *
event - with x/y coordinates or
4076      * leave empty
for default (screen centre)
4077      * @
return the manager object
4078      */

4079     _dialogDatepicker: function(input, date, onSelect, settings, pos) {
4080         
var id, browserWidth, browserHeight, scrollX, scrollY,
4081             inst =
this._dialogInst; // internal instance
4082
4083         
if (!inst) {
4084             
this.uuid += 1;
4085             id = "
dp" + this.uuid;
4086             
this._dialogInput = $("<input type='text' id='" + id +
4087                 
"' style='position: absolute; top: -100px; width: 0px;'/>");
4088             
this._dialogInput.keydown(this._doKeyDown);
4089             $(
"body").append(this._dialogInput);
4090             inst =
this._dialogInst = this._newInst(this._dialogInput, false);
4091             inst.settings = {};
4092             $.data(
this._dialogInput[0], "datepicker", inst);
4093         }
4094         datepicker_extendRemove(inst.settings, settings || {});
4095         date = (date && date.constructor === Date ?
this._formatDate(inst, date) : date);
4096         
this._dialogInput.val(date);
4097
4098         
this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
4099         
if (!this._pos) {
4100             browserWidth = document.documentElement.clientWidth;
4101             browserHeight = document.documentElement.clientHeight;
4102             scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
4103             scrollY = document.documentElement.scrollTop || document.body.scrollTop;
4104             
this._pos = // should use actual width/height below
4105                 [(browserWidth /
2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
4106         }
4107
4108         
// move input on screen for focus, but hidden behind dialog
4109         
this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
4110         inst.settings.onSelect = onSelect;
4111         
this._inDialog = true;
4112         
this.dpDiv.addClass(this._dialogClass);
4113         
this._showDatepicker(this._dialogInput[0]);
4114         
if ($.blockUI) {
4115             $.blockUI(
this.dpDiv);
4116         }
4117         $.data(
this._dialogInput[0], "datepicker", inst);
4118         
return this;
4119     },
4120
4121     
/* Detach a datepicker from its control.
4122      * @param target element - the target input field or division or span
4123      */

4124     _destroyDatepicker: function(target) {
4125         
var nodeName,
4126             $target = $(target),
4127             inst = $.data(target,
"datepicker");
4128
4129         
if (!$target.hasClass(this.markerClassName)) {
4130             
return;
4131         }
4132
4133         nodeName = target.nodeName.toLowerCase();
4134         $.removeData(target,
"datepicker");
4135         
if (nodeName === "input") {
4136             inst.append.
remove();
4137             inst.trigger.
remove();
4138             $target.removeClass(
this.markerClassName).
4139                 unbind(
"focus", this._showDatepicker).
4140                 unbind(
"keydown", this._doKeyDown).
4141                 unbind(
"keypress", this._doKeyPress).
4142                 unbind(
"keyup", this._doKeyUp);
4143         }
else if (nodeName === "div" || nodeName === "span") {
4144             $target.removeClass(
this.markerClassName).empty();
4145         }
4146
4147         
if ( datepicker_instActive === inst ) {
4148             datepicker_instActive =
null;
4149         }
4150     },
4151
4152     
/* Enable the date picker to a jQuery selection.
4153      * @param target element - the target input field or division or span
4154      */

4155     _enableDatepicker: function(target) {
4156         
var nodeName, inline,
4157             $target = $(target),
4158             inst = $.data(target,
"datepicker");
4159
4160         
if (!$target.hasClass(this.markerClassName)) {
4161             
return;
4162         }
4163
4164         nodeName = target.nodeName.toLowerCase();
4165         
if (nodeName === "input") {
4166             target.disabled =
false;
4167             inst.trigger.filter(
"button").
4168                 each(function() {
this.disabled = false; }).end().
4169                 filter(
"img").css({opacity: "1.0", cursor: ""});
4170         }
else if (nodeName === "div" || nodeName === "span") {
4171             inline = $target.children(
"." + this._inlineClass);
4172             inline.children().removeClass(
"ui-state-disabled");
4173             inline.find(
"select.ui-datepicker-month, select.ui-datepicker-year").
4174                 prop(
"disabled", false);
4175         }
4176         
this._disabledInputs = $.map(this._disabledInputs,
4177             function(
value) { return (value === target ? null : value); }); // delete entry
4178     },
4179
4180     
/* Disable the date picker to a jQuery selection.
4181      * @param target element - the target input field or division or span
4182      */

4183     _disableDatepicker: function(target) {
4184         
var nodeName, inline,
4185             $target = $(target),
4186             inst = $.data(target,
"datepicker");
4187
4188         
if (!$target.hasClass(this.markerClassName)) {
4189             
return;
4190         }
4191
4192         nodeName = target.nodeName.toLowerCase();
4193         
if (nodeName === "input") {
4194             target.disabled =
true;
4195             inst.trigger.filter(
"button").
4196                 each(function() {
this.disabled = true; }).end().
4197                 filter(
"img").css({opacity: "0.5", cursor: "default"});
4198         }
else if (nodeName === "div" || nodeName === "span") {
4199             inline = $target.children(
"." + this._inlineClass);
4200             inline.children().addClass(
"ui-state-disabled");
4201             inline.find(
"select.ui-datepicker-month, select.ui-datepicker-year").
4202                 prop(
"disabled", true);
4203         }
4204         
this._disabledInputs = $.map(this._disabledInputs,
4205             function(
value) { return (value === target ? null : value); }); // delete entry
4206         
this._disabledInputs[this._disabledInputs.length] = target;
4207     },
4208
4209     
/* Is the first field in a jQuery collection disabled as a datepicker?
4210      * @param target element - the target input field or division or span
4211      * @
return boolean - true if disabled, false if enabled
4212      */

4213     _isDisabledDatepicker: function(target) {
4214         
if (!target) {
4215             
return false;
4216         }
4217         
for (var i = 0; i < this._disabledInputs.length; i++) {
4218             
if (this._disabledInputs[i] === target) {
4219                 
return true;
4220             }
4221         }
4222         
return false;
4223     },
4224
4225     
/* Retrieve the instance data for the target control.
4226      * @param target element - the target input field or division or span
4227      * @
return object - the associated instance data
4228      * @throws error
if a jQuery problem getting data
4229      */

4230     _getInst: function(target) {
4231         
try {
4232             
return $.data(target, "datepicker");
4233         }
4234         
catch (err) {
4235             
throw "Missing instance data for this datepicker";
4236         }
4237     },
4238
4239     
/* Update or retrieve the settings for a date picker attached to an input field or division.
4240      * @param target element - the target input field or division or span
4241      * @param name
object - the new settings to update or
4242      *
string - the name of the setting to change or retrieve,
4243      *
when retrieving also "all" for all instance settings or
4244      *
"defaults" for all global defaults
4245      * @param
value any - the new value for the setting
4246      * (omit
if above is an object or to retrieve a value)
4247      */

4248     _optionDatepicker: function(target, name,
value) {
4249         
var settings, date, minDate, maxDate,
4250             inst =
this._getInst(target);
4251
4252         
if (arguments.length === 2 && typeof name === "string") {
4253             
return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
4254                 (inst ? (name ===
"all" ? $.extend({}, inst.settings) :
4255                 
this._get(inst, name)) : null));
4256         }
4257
4258         settings = name || {};
4259         
if (typeof name === "string") {
4260             settings = {};
4261             settings[name] =
value;
4262         }
4263
4264         
if (inst) {
4265             
if (this._curInst === inst) {
4266                 
this._hideDatepicker();
4267             }
4268
4269             date =
this._getDateDatepicker(target, true);
4270             minDate =
this._getMinMaxDate(inst, "min");
4271             maxDate =
this._getMinMaxDate(inst, "max");
4272             datepicker_extendRemove(inst.settings, settings);
4273             
// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
4274             
if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
4275                 inst.settings.minDate =
this._formatDate(inst, minDate);
4276             }
4277             
if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
4278                 inst.settings.maxDate =
this._formatDate(inst, maxDate);
4279             }
4280             
if ( "disabled" in settings ) {
4281                 
if ( settings.disabled ) {
4282                     
this._disableDatepicker(target);
4283                 }
else {
4284                     
this._enableDatepicker(target);
4285                 }
4286             }
4287             
this._attachments($(target), inst);
4288             
this._autoSize(inst);
4289             
this._setDate(inst, date);
4290             
this._updateAlternate(inst);
4291             
this._updateDatepicker(inst);
4292         }
4293     },
4294
4295     
// change method deprecated
4296     _changeDatepicker: function(target, name,
value) {
4297         
this._optionDatepicker(target, name, value);
4298     },
4299
4300     
/* Redraw the date picker attached to an input field or division.
4301      * @param target element - the target input field or division or span
4302      */

4303     _refreshDatepicker: function(target) {
4304         
var inst = this._getInst(target);
4305         
if (inst) {
4306             
this._updateDatepicker(inst);
4307         }
4308     },
4309
4310     
/* Set the dates for a jQuery selection.
4311      * @param target element - the target input field or division or span
4312      * @param date Date - the
new date
4313      */

4314     _setDateDatepicker: function(target, date) {
4315         
var inst = this._getInst(target);
4316         
if (inst) {
4317             
this._setDate(inst, date);
4318             
this._updateDatepicker(inst);
4319             
this._updateAlternate(inst);
4320         }
4321     },
4322
4323     
/* Get the date(s) for the first entry in a jQuery selection.
4324      * @param target element - the target input field or division or span
4325      * @param noDefault boolean -
true if no default date is to be used
4326      * @
return Date - the current date
4327      */

4328     _getDateDatepicker: function(target, noDefault) {
4329         
var inst = this._getInst(target);
4330         
if (inst && !inst.inline) {
4331             
this._setDateFromField(inst, noDefault);
4332         }
4333         
return (inst ? this._getDate(inst) : null);
4334     },
4335
4336     
/* Handle keystrokes. */
4337     _doKeyDown: function(
event) {
4338         
var onSelect, dateStr, sel,
4339             inst = $.datepicker._getInst(
event.target),
4340             handled =
true,
4341             isRTL = inst.dpDiv.
is(".ui-datepicker-rtl");
4342
4343         inst._keyEvent =
true;
4344         
if ($.datepicker._datepickerShowing) {
4345             
switch (event.keyCode) {
4346                 
case 9: $.datepicker._hideDatepicker();
4347                         handled =
false;
4348                         
break; // hide on tab out
4349                 
case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
4350                                     $.datepicker._currentClass +
")", inst.dpDiv);
4351                         
if (sel[0]) {
4352                             $.datepicker._selectDay(
event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
4353                         }
4354
4355                         onSelect = $.datepicker._get(inst,
"onSelect");
4356                         
if (onSelect) {
4357                             dateStr = $.datepicker._formatDate(inst);
4358
4359                             
// trigger custom callback
4360                             onSelect.apply((inst.input ? inst.input[
0] : null), [dateStr, inst]);
4361                         }
else {
4362                             $.datepicker._hideDatepicker();
4363                         }
4364
4365                         
return false; // don't submit the form
4366                 
case 27: $.datepicker._hideDatepicker();
4367                         
break; // hide on escape
4368                 
case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
4369                             -$.datepicker._get(inst,
"stepBigMonths") :
4370                             -$.datepicker._get(inst,
"stepMonths")), "M");
4371                         
break; // previous month/year on page up/+ ctrl
4372                 
case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
4373                             +$.datepicker._get(inst,
"stepBigMonths") :
4374                             +$.datepicker._get(inst,
"stepMonths")), "M");
4375                         
break; // next month/year on page down/+ ctrl
4376                 
case 35: if (event.ctrlKey || event.metaKey) {
4377                             $.datepicker._clearDate(
event.target);
4378                         }
4379                         handled =
event.ctrlKey || event.metaKey;
4380                         
break; // clear on ctrl or command +end
4381                 
case 36: if (event.ctrlKey || event.metaKey) {
4382                             $.datepicker._gotoToday(
event.target);
4383                         }
4384                         handled =
event.ctrlKey || event.metaKey;
4385                         
break; // current on ctrl or command +home
4386                 
case 37: if (event.ctrlKey || event.metaKey) {
4387                             $.datepicker._adjustDate(
event.target, (isRTL ? +1 : -1), "D");
4388                         }
4389                         handled =
event.ctrlKey || event.metaKey;
4390                         
// -1 day on ctrl or command +left
4391                         
if (event.originalEvent.altKey) {
4392                             $.datepicker._adjustDate(
event.target, (event.ctrlKey ?
4393                                 -$.datepicker._get(inst,
"stepBigMonths") :
4394                                 -$.datepicker._get(inst,
"stepMonths")), "M");
4395                         }
4396                         
// next month/year on alt +left on Mac
4397                         
break;
4398                 
case 38: if (event.ctrlKey || event.metaKey) {
4399                             $.datepicker._adjustDate(
event.target, -7, "D");
4400                         }
4401                         handled =
event.ctrlKey || event.metaKey;
4402                         
break; // -1 week on ctrl or command +up
4403                 
case 39: if (event.ctrlKey || event.metaKey) {
4404                             $.datepicker._adjustDate(
event.target, (isRTL ? -1 : +1), "D");
4405                         }
4406                         handled =
event.ctrlKey || event.metaKey;
4407                         
// +1 day on ctrl or command +right
4408                         
if (event.originalEvent.altKey) {
4409                             $.datepicker._adjustDate(
event.target, (event.ctrlKey ?
4410                                 +$.datepicker._get(inst,
"stepBigMonths") :
4411                                 +$.datepicker._get(inst,
"stepMonths")), "M");
4412                         }
4413                         
// next month/year on alt +right
4414                         
break;
4415                 
case 40: if (event.ctrlKey || event.metaKey) {
4416                             $.datepicker._adjustDate(
event.target, +7, "D");
4417                         }
4418                         handled =
event.ctrlKey || event.metaKey;
4419                         
break; // +1 week on ctrl or command +down
4420                 
default: handled = false;
4421             }
4422         }
else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
4423             $.datepicker._showDatepicker(
this);
4424         }
else {
4425             handled =
false;
4426         }
4427
4428         
if (handled) {
4429             
event.preventDefault();
4430             
event.stopPropagation();
4431         }
4432     },
4433
4434     
/* Filter entered characters - based on date format. */
4435     _doKeyPress: function(
event) {
4436         
var chars, chr,
4437             inst = $.datepicker._getInst(
event.target);
4438
4439         
if ($.datepicker._get(inst, "constrainInput")) {
4440             chars = $.datepicker._possibleChars($.datepicker._get(inst,
"dateFormat"));
4441             chr = String.fromCharCode(
event.charCode == null ? event.keyCode : event.charCode);
4442             
return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
4443         }
4444     },
4445
4446     
/* Synchronise manual entry and field/alternate field. */
4447     _doKeyUp: function(
event) {
4448         
var date,
4449             inst = $.datepicker._getInst(
event.target);
4450
4451         
if (inst.input.val() !== inst.lastVal) {
4452             
try {
4453                 date = $.datepicker.parseDate($.datepicker._get(inst,
"dateFormat"),
4454                     (inst.input ? inst.input.val() :
null),
4455                     $.datepicker._getFormatConfig(inst));
4456
4457                 
if (date) { // only if valid
4458                     $.datepicker._setDateFromField(inst);
4459                     $.datepicker._updateAlternate(inst);
4460                     $.datepicker._updateDatepicker(inst);
4461                 }
4462             }
4463             
catch (err) {
4464             }
4465         }
4466         
return true;
4467     },
4468
4469     
/* Pop-up the date picker for a given input field.
4470      * If
false returned from beforeShow event handler do not show.
4471      * @param input element - the input field attached to the date picker or
4472      *
event - if triggered by focus
4473      */

4474     _showDatepicker: function(input) {
4475         input = input.target || input;
4476         
if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
4477             input = $(
"input", input.parentNode)[0];
4478         }
4479
4480         
if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
4481             
return;
4482         }
4483
4484         
var inst, beforeShow, beforeShowSettings, isFixed,
4485             offset, showAnim, duration;
4486
4487         inst = $.datepicker._getInst(input);
4488         
if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
4489             $.datepicker._curInst.dpDiv.stop(
true, true);
4490             
if ( inst && $.datepicker._datepickerShowing ) {
4491                 $.datepicker._hideDatepicker( $.datepicker._curInst.input[
0] );
4492             }
4493         }
4494
4495         beforeShow = $.datepicker._get(inst,
"beforeShow");
4496         beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
4497         
if(beforeShowSettings === false){
4498             
return;
4499         }
4500         datepicker_extendRemove(inst.settings, beforeShowSettings);
4501
4502         inst.lastVal =
null;
4503         $.datepicker._lastInput = input;
4504         $.datepicker._setDateFromField(inst);
4505
4506         
if ($.datepicker._inDialog) { // hide cursor
4507             input.
value = "";
4508         }
4509         
if (!$.datepicker._pos) { // position below input
4510             $.datepicker._pos = $.datepicker._findPos(input);
4511             $.datepicker._pos[
1] += input.offsetHeight; // add the height
4512         }
4513
4514         isFixed =
false;
4515         $(input).parents().each(function() {
4516             isFixed |= $(
this).css("position") === "fixed";
4517             
return !isFixed;
4518         });
4519
4520         offset = {left: $.datepicker._pos[
0], top: $.datepicker._pos[1]};
4521         $.datepicker._pos =
null;
4522         
//to avoid flashes on Firefox
4523         inst.dpDiv.empty();
4524         
// determine sizing offscreen
4525         inst.dpDiv.css({position:
"absolute", display: "block", top: "-1000px"});
4526         $.datepicker._updateDatepicker(inst);
4527         
// fix width for dynamic number of date pickers
4528         
// and adjust position before showing
4529         offset = $.datepicker._checkOffset(inst, offset, isFixed);
4530         inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
4531             
"static" : (isFixed ? "fixed" : "absolute")), display: "none",
4532             left: offset.left +
"px", top: offset.top + "px"});
4533
4534         
if (!inst.inline) {
4535             showAnim = $.datepicker._get(inst,
"showAnim");
4536             duration = $.datepicker._get(inst,
"duration");
4537             inst.dpDiv.css(
"z-index", datepicker_getZindex( $( input ) ) + 1 );
4538             $.datepicker._datepickerShowing =
true;
4539
4540             
if ( $.effects && $.effects.effect[ showAnim ] ) {
4541                 inst.dpDiv.show(showAnim, $.datepicker._get(inst,
"showOptions"), duration);
4542             }
else {
4543                 inst.dpDiv[showAnim ||
"show"](showAnim ? duration : null);
4544             }
4545
4546             
if ( $.datepicker._shouldFocusInput( inst ) ) {
4547                 inst.input.focus();
4548             }
4549
4550             $.datepicker._curInst = inst;
4551         }
4552     },
4553
4554     
/* Generate the date picker content. */
4555     _updateDatepicker: function(inst) {
4556         
this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
4557         datepicker_instActive = inst;
// for delegate hover events
4558         inst.dpDiv.empty().append(
this._generateHTML(inst));
4559         
this._attachHandlers(inst);
4560
4561         
var origyearshtml,
4562             numMonths =
this._getNumberOfMonths(inst),
4563             cols = numMonths[
1],
4564             width =
17,
4565             activeCell = inst.dpDiv.find(
"." + this._dayOverClass + " a" );
4566
4567         
if ( activeCell.length > 0 ) {
4568             datepicker_handleMouseover.apply( activeCell.
get( 0 ) );
4569         }
4570
4571         inst.dpDiv.removeClass(
"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
4572         
if (cols > 1) {
4573             inst.dpDiv.addClass(
"ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
4574         }
4575         inst.dpDiv[(numMonths[
0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
4576             
"Class"]("ui-datepicker-multi");
4577         inst.dpDiv[(
this._get(inst, "isRTL") ? "add" : "remove") +
4578             
"Class"]("ui-datepicker-rtl");
4579
4580         
if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
4581             inst.input.focus();
4582         }
4583
4584         
// deffered render of the years select (to avoid flashes on Firefox)
4585         
if( inst.yearshtml ){
4586             origyearshtml = inst.yearshtml;
4587             setTimeout(function(){
4588                 
//assure that inst.yearshtml didn't change.
4589                 
if( origyearshtml === inst.yearshtml && inst.yearshtml ){
4590                     inst.dpDiv.find(
"select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
4591                 }
4592                 origyearshtml = inst.yearshtml =
null;
4593             },
0);
4594         }
4595     },
4596
4597     
// #6694 - don't focus the input if it's already focused
4598     
// this breaks the change event in IE
4599     
// Support: IE and jQuery <1.9
4600     _shouldFocusInput: function( inst ) {
4601         
return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
4602     },
4603
4604     
/* Check positioning to remain on screen. */
4605     _checkOffset: function(inst, offset, isFixed) {
4606         
var dpWidth = inst.dpDiv.outerWidth(),
4607             dpHeight = inst.dpDiv.outerHeight(),
4608             inputWidth = inst.input ? inst.input.outerWidth() :
0,
4609             inputHeight = inst.input ? inst.input.outerHeight() :
0,
4610             viewWidth = document.documentElement.clientWidth + (isFixed ?
0 : $(document).scrollLeft()),
4611             viewHeight = document.documentElement.clientHeight + (isFixed ?
0 : $(document).scrollTop());
4612
4613         offset.left -= (
this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
4614         offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() :
0;
4615         offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() :
0;
4616
4617         
// now check if datepicker is showing outside window viewport - move to a better place if so.
4618         offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
4619             Math.abs(offset.left + dpWidth - viewWidth) :
0);
4620         offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
4621             Math.abs(dpHeight + inputHeight) :
0);
4622
4623         
return offset;
4624     },
4625
4626     
/* Find an object's position on the screen. */
4627     _findPos: function(obj) {
4628         
var position,
4629             inst =
this._getInst(obj),
4630             isRTL =
this._get(inst, "isRTL");
4631
4632         
while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
4633             obj = obj[isRTL ?
"previousSibling" : "nextSibling"];
4634         }
4635
4636         position = $(obj).offset();
4637         
return [position.left, position.top];
4638     },
4639
4640     
/* Hide the date picker from view.
4641      * @param input element - the input field attached to the date picker
4642      */

4643     _hideDatepicker: function(input) {
4644         
var showAnim, duration, postProcess, onClose,
4645             inst =
this._curInst;
4646
4647         
if (!inst || (input && inst !== $.data(input, "datepicker"))) {
4648             
return;
4649         }
4650
4651         
if (this._datepickerShowing) {
4652             showAnim =
this._get(inst, "showAnim");
4653             duration =
this._get(inst, "duration");
4654             postProcess = function() {
4655                 $.datepicker._tidyDialog(inst);
4656             };
4657
4658             
// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
4659             
if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
4660                 inst.dpDiv.hide(showAnim, $.datepicker._get(inst,
"showOptions"), duration, postProcess);
4661             }
else {
4662                 inst.dpDiv[(showAnim ===
"slideDown" ? "slideUp" :
4663                     (showAnim ===
"fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
4664             }
4665
4666             
if (!showAnim) {
4667                 postProcess();
4668             }
4669             
this._datepickerShowing = false;
4670
4671             onClose =
this._get(inst, "onClose");
4672             
if (onClose) {
4673                 onClose.apply((inst.input ? inst.input[
0] : null), [(inst.input ? inst.input.val() : ""), inst]);
4674             }
4675
4676             
this._lastInput = null;
4677             
if (this._inDialog) {
4678                 
this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
4679                 
if ($.blockUI) {
4680                     $.unblockUI();
4681                     $(
"body").append(this.dpDiv);
4682                 }
4683             }
4684             
this._inDialog = false;
4685         }
4686     },
4687
4688     
/* Tidy up after a dialog display. */
4689     _tidyDialog: function(inst) {
4690         inst.dpDiv.removeClass(
this._dialogClass).unbind(".ui-datepicker-calendar");
4691     },
4692
4693     
/* Close date picker if clicked elsewhere. */
4694     _checkExternalClick: function(
event) {
4695         
if (!$.datepicker._curInst) {
4696             
return;
4697         }
4698
4699         
var $target = $(event.target),
4700             inst = $.datepicker._getInst($target[
0]);
4701
4702         
if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
4703                 $target.parents(
"#" + $.datepicker._mainDivId).length === 0 &&
4704                 !$target.hasClass($.datepicker.markerClassName) &&
4705                 !$target.closest(
"." + $.datepicker._triggerClass).length &&
4706                 $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
4707             ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
4708                 $.datepicker._hideDatepicker();
4709         }
4710     },
4711
4712     
/* Adjust one of the date sub-fields. */
4713     _adjustDate: function(id, offset, period) {
4714         
var target = $(id),
4715             inst =
this._getInst(target[0]);
4716
4717         
if (this._isDisabledDatepicker(target[0])) {
4718             
return;
4719         }
4720         
this._adjustInstDate(inst, offset +
4721             (period ===
"M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
4722             period);
4723         
this._updateDatepicker(inst);
4724     },
4725
4726     
/* Action for current link. */
4727     _gotoToday: function(id) {
4728         
var date,
4729             target = $(id),
4730             inst =
this._getInst(target[0]);
4731
4732         
if (this._get(inst, "gotoCurrent") && inst.currentDay) {
4733             inst.selectedDay = inst.currentDay;
4734             inst.drawMonth = inst.selectedMonth = inst.currentMonth;
4735             inst.drawYear = inst.selectedYear = inst.currentYear;
4736         }
else {
4737             date =
new Date();
4738             inst.selectedDay = date.getDate();
4739             inst.drawMonth = inst.selectedMonth = date.getMonth();
4740             inst.drawYear = inst.selectedYear = date.getFullYear();
4741         }
4742         
this._notifyChange(inst);
4743         
this._adjustDate(target);
4744     },
4745
4746     
/* Action for selecting a new month/year. */
4747     _selectMonthYear: function(id,
select, period) {
4748         
var target = $(id),
4749             inst =
this._getInst(target[0]);
4750
4751         inst[
"selected" + (period === "M" ? "Month" : "Year")] =
4752         inst[
"draw" + (period === "M" ? "Month" : "Year")] =
4753             parseInt(
select.options[select.selectedIndex].value,10);
4754
4755         
this._notifyChange(inst);
4756         
this._adjustDate(target);
4757     },
4758
4759     
/* Action for selecting a day. */
4760     _selectDay: function(id, month, year, td) {
4761         
var inst,
4762             target = $(id);
4763
4764         
if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
4765             
return;
4766         }
4767
4768         inst =
this._getInst(target[0]);
4769         inst.selectedDay = inst.currentDay = $(
"a", td).html();
4770         inst.selectedMonth = inst.currentMonth = month;
4771         inst.selectedYear = inst.currentYear = year;
4772         
this._selectDate(id, this._formatDate(inst,
4773             inst.currentDay, inst.currentMonth, inst.currentYear));
4774     },
4775
4776     
/* Erase the input field and hide the date picker. */
4777     _clearDate: function(id) {
4778         
var target = $(id);
4779         
this._selectDate(target, "");
4780     },
4781
4782     
/* Update the input field with the selected date. */
4783     _selectDate: function(id, dateStr) {
4784         
var onSelect,
4785             target = $(id),
4786             inst =
this._getInst(target[0]);
4787
4788         dateStr = (dateStr !=
null ? dateStr : this._formatDate(inst));
4789         
if (inst.input) {
4790             inst.input.val(dateStr);
4791         }
4792         
this._updateAlternate(inst);
4793
4794         onSelect =
this._get(inst, "onSelect");
4795         
if (onSelect) {
4796             onSelect.apply((inst.input ? inst.input[
0] : null), [dateStr, inst]); // trigger custom callback
4797         }
else if (inst.input) {
4798             inst.input.trigger(
"change"); // fire the change event
4799         }
4800
4801         
if (inst.inline){
4802             
this._updateDatepicker(inst);
4803         }
else {
4804             
this._hideDatepicker();
4805             
this._lastInput = inst.input[0];
4806             
if (typeof(inst.input[0]) !== "object") {
4807                 inst.input.focus();
// restore focus
4808             }
4809             
this._lastInput = null;
4810         }
4811     },
4812
4813     
/* Update any alternate field to synchronise with the main field. */
4814     _updateAlternate: function(inst) {
4815         
var altFormat, date, dateStr,
4816             altField =
this._get(inst, "altField");
4817
4818         
if (altField) { // update alternate field too
4819             altFormat =
this._get(inst, "altFormat") || this._get(inst, "dateFormat");
4820             date =
this._getDate(inst);
4821             dateStr =
this.formatDate(altFormat, date, this._getFormatConfig(inst));
4822             $(altField).each(function() { $(
this).val(dateStr); });
4823         }
4824     },
4825
4826     
/* Set as beforeShowDay function to prevent selection of weekends.
4827      * @param date Date - the date to customise
4828      * @
return [boolean, string] - is this date selectable?, what is its CSS class?
4829      */

4830     noWeekends: function(date) {
4831         
var day = date.getDay();
4832         
return [(day > 0 && day < 6), ""];
4833     },
4834
4835     
/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
4836      * @param date Date - the date to
get the week for
4837      * @
return number - the number of the week within the year that contains this date
4838      */

4839     iso8601Week: function(date) {
4840         
var time,
4841             checkDate =
new Date(date.getTime());
4842
4843         
// Find Thursday of this week starting on Monday
4844         checkDate.setDate(checkDate.getDate() +
4 - (checkDate.getDay() || 7));
4845
4846         time = checkDate.getTime();
4847         checkDate.setMonth(
0); // Compare with Jan 1
4848         checkDate.setDate(
1);
4849         
return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
4850     },
4851
4852     
/* Parse a string value into a date object.
4853      * See formatDate below
for the possible formats.
4854      *
4855      * @param format
string - the expected format of the date
4856      * @param
value string - the date in the above format
4857      * @param settings Object - attributes include:
4858      * shortYearCutoff number - the cutoff year
for determining the century (optional)
4859      * dayNamesShort
string[7] - abbreviated names of the days from Sunday (optional)
4860      * dayNames
string[7] - names of the days from Sunday (optional)
4861      * monthNamesShort
string[12] - abbreviated names of the months (optional)
4862      * monthNames
string[12] - names of the months (optional)
4863      * @
return Date - the extracted date value or null if value is blank
4864      */

4865     parseDate: function (format,
value, settings) {
4866         
if (format == null || value == null) {
4867             
throw "Invalid arguments";
4868         }
4869
4870         
value = (typeof value === "object" ? value.toString() : value + "");
4871         
if (value === "") {
4872             
return null;
4873         }
4874
4875         
var iFormat, dim, extra,
4876             iValue =
0,
4877             shortYearCutoffTemp = (settings ? settings.shortYearCutoff :
null) || this._defaults.shortYearCutoff,
4878             shortYearCutoff = (
typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
4879                 
new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
4880             dayNamesShort = (settings ? settings.dayNamesShort :
null) || this._defaults.dayNamesShort,
4881             dayNames = (settings ? settings.dayNames :
null) || this._defaults.dayNames,
4882             monthNamesShort = (settings ? settings.monthNamesShort :
null) || this._defaults.monthNamesShort,
4883             monthNames = (settings ? settings.monthNames :
null) || this._defaults.monthNames,
4884             year = -
1,
4885             month = -
1,
4886             day = -
1,
4887             doy = -
1,
4888             literal =
false,
4889             date,
4890             
// Check whether a format character is doubled
4891             lookAhead = function(match) {
4892                 
var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
4893                 
if (matches) {
4894                     iFormat++;
4895                 }
4896                 
return matches;
4897             },
4898             
// Extract a number from the string value
4899             getNumber = function(match) {
4900                 
var isDoubled = lookAhead(match),
4901                     size = (match ===
"@" ? 14 : (match === "!" ? 20 :
4902                     (match ===
"y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
4903                     minSize = (match ===
"y" ? size : 1),
4904                     digits =
new RegExp("^\\d{" + minSize + "," + size + "}"),
4905                     num =
value.substring(iValue).match(digits);
4906                 
if (!num) {
4907                     
throw "Missing number at position " + iValue;
4908                 }
4909                 iValue += num[
0].length;
4910                 
return parseInt(num[0], 10);
4911             },
4912             
// Extract a name from the string value and convert to an index
4913             getName = function(match, shortNames, longNames) {
4914                 
var index = -1,
4915                     names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
4916                         
return [ [k, v] ];
4917                     }).sort(function (a, b) {
4918                         
return -(a[1].length - b[1].length);
4919                     });
4920
4921                 $.each(names, function (i, pair) {
4922                     
var name = pair[1];
4923                     
if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
4924                         index = pair[
0];
4925                         iValue += name.length;
4926                         
return false;
4927                     }
4928                 });
4929                 
if (index !== -1) {
4930                     
return index + 1;
4931                 }
else {
4932                     
throw "Unknown name at position " + iValue;
4933                 }
4934             },
4935             
// Confirm that a literal character matches the string value
4936             checkLiteral = function() {
4937                 
if (value.charAt(iValue) !== format.charAt(iFormat)) {
4938                     
throw "Unexpected literal at position " + iValue;
4939                 }
4940                 iValue++;
4941             };
4942
4943         
for (iFormat = 0; iFormat < format.length; iFormat++) {
4944             
if (literal) {
4945                 
if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
4946                     literal =
false;
4947                 }
else {
4948                     checkLiteral();
4949                 }
4950             }
else {
4951                 
switch (format.charAt(iFormat)) {
4952                     
case "d":
4953                         day = getNumber(
"d");
4954                         
break;
4955                     
case "D":
4956                         getName(
"D", dayNamesShort, dayNames);
4957                         
break;
4958                     
case "o":
4959                         doy = getNumber(
"o");
4960                         
break;
4961                     
case "m":
4962                         month = getNumber(
"m");
4963                         
break;
4964                     
case "M":
4965                         month = getName(
"M", monthNamesShort, monthNames);
4966                         
break;
4967                     
case "y":
4968                         year = getNumber(
"y");
4969                         
break;
4970                     
case "@":
4971                         date =
new Date(getNumber("@"));
4972                         year = date.getFullYear();
4973                         month = date.getMonth() +
1;
4974                         day = date.getDate();
4975                         
break;
4976                     
case "!":
4977                         date =
new Date((getNumber("!") - this._ticksTo1970) / 10000);
4978                         year = date.getFullYear();
4979                         month = date.getMonth() +
1;
4980                         day = date.getDate();
4981                         
break;
4982                     
case "'":
4983                         
if (lookAhead("'")){
4984                             checkLiteral();
4985                         }
else {
4986                             literal =
true;
4987                         }
4988                         
break;
4989                     
default:
4990                         checkLiteral();
4991                 }
4992             }
4993         }
4994
4995         
if (iValue < value.length){
4996             extra =
value.substr(iValue);
4997             
if (!/^\s+/.test(extra)) {
4998                 
throw "Extra/unparsed characters found in date: " + extra;
4999             }
5000         }
5001
5002         
if (year === -1) {
5003             year =
new Date().getFullYear();
5004         }
else if (year < 100) {
5005             year +=
new Date().getFullYear() - new Date().getFullYear() % 100 +
5006                 (year <= shortYearCutoff ?
0 : -100);
5007         }
5008
5009         
if (doy > -1) {
5010             month =
1;
5011             day = doy;
5012             
do {
5013                 dim =
this._getDaysInMonth(year, month - 1);
5014                 
if (day <= dim) {
5015                     
break;
5016                 }
5017                 month++;
5018                 day -= dim;
5019             }
while (true);
5020         }
5021
5022         date =
this._daylightSavingAdjust(new Date(year, month - 1, day));
5023         
if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
5024             
throw "Invalid date"; // E.g. 31/02/00
5025         }
5026         
return date;
5027     },
5028
5029     
/* Standard date formats. */
5030     ATOM:
"yy-mm-dd", // RFC 3339 (ISO 8601)
5031     COOKIE:
"D, dd M yy",
5032     ISO_8601:
"yy-mm-dd",
5033     RFC_822:
"D, d M y",
5034     RFC_850:
"DD, dd-M-y",
5035     RFC_1036:
"D, d M y",
5036     RFC_1123:
"D, d M yy",
5037     RFC_2822:
"D, d M yy",
5038     RSS:
"D, d M y", // RFC 822
5039     TICKS:
"!",
5040     TIMESTAMP:
"@",
5041     W3C:
"yy-mm-dd", // ISO 8601
5042
5043     _ticksTo1970: (((
1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
5044         Math.floor(
1970 / 400)) * 24 * 60 * 60 * 10000000),
5045
5046     
/* Format a date object into a string value.
5047      * The format can be combinations of the following:
5048      * d - day of month (no leading zero)
5049      * dd - day of month (two digit)
5050      * o - day of year (no leading zeros)
5051      * oo - day of year (three digit)
5052      * D - day name
short
5053      * DD - day name
long
5054      * m - month of year (no leading zero)
5055      * mm - month of year (two digit)
5056      * M - month name
short
5057      * MM - month name
long
5058      * y - year (two digit)
5059      * yy - year (four digit)
5060      * @ - Unix timestamp (ms since
01/01/1970)
5061      * ! - Windows ticks (100ns since
01/01/0001)
5062      *
"..." - literal text
5063      *
'' - single quote
5064      *
5065      * @param format
string - the desired format of the date
5066      * @param date Date - the date
value to format
5067      * @param settings Object - attributes include:
5068      * dayNamesShort
string[7] - abbreviated names of the days from Sunday (optional)
5069      * dayNames
string[7] - names of the days from Sunday (optional)
5070      * monthNamesShort
string[12] - abbreviated names of the months (optional)
5071      * monthNames
string[12] - names of the months (optional)
5072      * @
return string - the date in the above format
5073      */

5074     formatDate: function (format, date, settings) {
5075         
if (!date) {
5076             
return "";
5077         }
5078
5079         
var iFormat,
5080             dayNamesShort = (settings ? settings.dayNamesShort :
null) || this._defaults.dayNamesShort,
5081             dayNames = (settings ? settings.dayNames :
null) || this._defaults.dayNames,
5082             monthNamesShort = (settings ? settings.monthNamesShort :
null) || this._defaults.monthNamesShort,
5083             monthNames = (settings ? settings.monthNames :
null) || this._defaults.monthNames,
5084             
// Check whether a format character is doubled
5085             lookAhead = function(match) {
5086                 
var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
5087                 
if (matches) {
5088                     iFormat++;
5089                 }
5090                 
return matches;
5091             },
5092             
// Format a number, with leading zero if necessary
5093             formatNumber = function(match,
value, len) {
5094                 
var num = "" + value;
5095                 
if (lookAhead(match)) {
5096                     
while (num.length < len) {
5097                         num =
"0" + num;
5098                     }
5099                 }
5100                 
return num;
5101             },
5102             
// Format a name, short or long as requested
5103             formatName = function(match,
value, shortNames, longNames) {
5104                 
return (lookAhead(match) ? longNames[value] : shortNames[value]);
5105             },
5106             output =
"",
5107             literal =
false;
5108
5109         
if (date) {
5110             
for (iFormat = 0; iFormat < format.length; iFormat++) {
5111                 
if (literal) {
5112                     
if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
5113                         literal =
false;
5114                     }
else {
5115                         output += format.charAt(iFormat);
5116                     }
5117                 }
else {
5118                     
switch (format.charAt(iFormat)) {
5119                         
case "d":
5120                             output += formatNumber(
"d", date.getDate(), 2);
5121                             
break;
5122                         
case "D":
5123                             output += formatName(
"D", date.getDay(), dayNamesShort, dayNames);
5124                             
break;
5125                         
case "o":
5126                             output += formatNumber(
"o",
5127                                 Math.round((
new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
5128                             
break;
5129                         
case "m":
5130                             output += formatNumber(
"m", date.getMonth() + 1, 2);
5131                             
break;
5132                         
case "M":
5133                             output += formatName(
"M", date.getMonth(), monthNamesShort, monthNames);
5134                             
break;
5135                         
case "y":
5136                             output += (lookAhead(
"y") ? date.getFullYear() :
5137                                 (date.getYear() %
100 < 10 ? "0" : "") + date.getYear() % 100);
5138                             
break;
5139                         
case "@":
5140                             output += date.getTime();
5141                             
break;
5142                         
case "!":
5143                             output += date.getTime() *
10000 + this._ticksTo1970;
5144                             
break;
5145                         
case "'":
5146                             
if (lookAhead("'")) {
5147                                 output +=
"'";
5148                             }
else {
5149                                 literal =
true;
5150                             }
5151                             
break;
5152                         
default:
5153                             output += format.charAt(iFormat);
5154                     }
5155                 }
5156             }
5157         }
5158         
return output;
5159     },
5160
5161     
/* Extract all possible characters from the date format. */
5162     _possibleChars: function (format) {
5163         
var iFormat,
5164             chars =
"",
5165             literal =
false,
5166             
// Check whether a format character is doubled
5167             lookAhead = function(match) {
5168                 
var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
5169                 
if (matches) {
5170                     iFormat++;
5171                 }
5172                 
return matches;
5173             };
5174
5175         
for (iFormat = 0; iFormat < format.length; iFormat++) {
5176             
if (literal) {
5177                 
if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
5178                     literal =
false;
5179                 }
else {
5180                     chars += format.charAt(iFormat);
5181                 }
5182             }
else {
5183                 
switch (format.charAt(iFormat)) {
5184                     
case "d": case "m": case "y": case "@":
5185                         chars +=
"0123456789";
5186                         
break;
5187                     
case "D": case "M":
5188                         
return null; // Accept anything
5189                     
case "'":
5190                         
if (lookAhead("'")) {
5191                             chars +=
"'";
5192                         }
else {
5193                             literal =
true;
5194                         }
5195                         
break;
5196                     
default:
5197                         chars += format.charAt(iFormat);
5198                 }
5199             }
5200         }
5201         
return chars;
5202     },
5203
5204     
/* Get a setting value, defaulting if necessary. */
5205     _get: function(inst, name) {
5206         
return inst.settings[name] !== undefined ?
5207             inst.settings[name] :
this._defaults[name];
5208     },
5209
5210     
/* Parse existing date and initialise date picker. */
5211     _setDateFromField: function(inst, noDefault) {
5212         
if (inst.input.val() === inst.lastVal) {
5213             
return;
5214         }
5215
5216         
var dateFormat = this._get(inst, "dateFormat"),
5217             dates = inst.lastVal = inst.input ? inst.input.val() :
null,
5218             defaultDate =
this._getDefaultDate(inst),
5219             date = defaultDate,
5220             settings =
this._getFormatConfig(inst);
5221
5222         
try {
5223             date =
this.parseDate(dateFormat, dates, settings) || defaultDate;
5224         }
catch (event) {
5225             dates = (noDefault ?
"" : dates);
5226         }
5227         inst.selectedDay = date.getDate();
5228         inst.drawMonth = inst.selectedMonth = date.getMonth();
5229         inst.drawYear = inst.selectedYear = date.getFullYear();
5230         inst.currentDay = (dates ? date.getDate() :
0);
5231         inst.currentMonth = (dates ? date.getMonth() :
0);
5232         inst.currentYear = (dates ? date.getFullYear() :
0);
5233         
this._adjustInstDate(inst);
5234     },
5235
5236     
/* Retrieve the default date shown on opening. */
5237     _getDefaultDate: function(inst) {
5238         
return this._restrictMinMax(inst,
5239             
this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
5240     },
5241
5242     
/* A date may be specified as an exact value or a relative one. */
5243     _determineDate: function(inst, date, defaultDate) {
5244         
var offsetNumeric = function(offset) {
5245                 
var date = new Date();
5246                 date.setDate(date.getDate() + offset);
5247                 
return date;
5248             },
5249             offsetString = function(offset) {
5250                 
try {
5251                     
return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
5252                         offset, $.datepicker._getFormatConfig(inst));
5253                 }
5254                 
catch (e) {
5255                     
// Ignore
5256                 }
5257
5258                 
var date = (offset.toLowerCase().match(/^c/) ?
5259                     $.datepicker._getDate(inst) :
null) || new Date(),
5260                     year = date.getFullYear(),
5261                     month = date.getMonth(),
5262                     day = date.getDate(),
5263                     pattern = /([+\-]?[
0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
5264                     matches = pattern.exec(offset);
5265
5266                 
while (matches) {
5267                     
switch (matches[2] || "d") {
5268                         
case "d" : case "D" :
5269                             day += parseInt(matches[
1],10); break;
5270                         
case "w" : case "W" :
5271                             day += parseInt(matches[
1],10) * 7; break;
5272                         
case "m" : case "M" :
5273                             month += parseInt(matches[
1],10);
5274                             day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
5275                             
break;
5276                         
case "y": case "Y" :
5277                             year += parseInt(matches[
1],10);
5278                             day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
5279                             
break;
5280                     }
5281                     matches = pattern.exec(offset);
5282                 }
5283                 
return new Date(year, month, day);
5284             },
5285             newDate = (date ==
null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
5286                 (
typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
5287
5288         newDate = (newDate && newDate.toString() ===
"Invalid Date" ? defaultDate : newDate);
5289         
if (newDate) {
5290             newDate.setHours(
0);
5291             newDate.setMinutes(
0);
5292             newDate.setSeconds(
0);
5293             newDate.setMilliseconds(
0);
5294         }
5295         
return this._daylightSavingAdjust(newDate);
5296     },
5297
5298     
/* Handle switch to/from daylight saving.
5299      * Hours may be non-zero
on daylight saving cut-over:
5300      * >
12 when midnight changeover, but then cannot generate
5301      * midnight datetime, so jump to 1AM, otherwise reset.
5302      * @param date (Date) the date to check
5303      * @
return (Date) the corrected date
5304      */

5305     _daylightSavingAdjust: function(date) {
5306         
if (!date) {
5307             
return null;
5308         }
5309         date.setHours(date.getHours() >
12 ? date.getHours() + 2 : 0);
5310         
return date;
5311     },
5312
5313     
/* Set the date(s) directly. */
5314     _setDate: function(inst, date, noChange) {
5315         
var clear = !date,
5316             origMonth = inst.selectedMonth,
5317             origYear = inst.selectedYear,
5318             newDate =
this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
5319
5320         inst.selectedDay = inst.currentDay = newDate.getDate();
5321         inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
5322         inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
5323         
if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
5324             
this._notifyChange(inst);
5325         }
5326         
this._adjustInstDate(inst);
5327         
if (inst.input) {
5328             inst.input.val(clear ?
"" : this._formatDate(inst));
5329         }
5330     },
5331
5332     
/* Retrieve the date(s) directly. */
5333     _getDate: function(inst) {
5334         
var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
5335             
this._daylightSavingAdjust(new Date(
5336             inst.currentYear, inst.currentMonth, inst.currentDay)));
5337             
return startDate;
5338     },
5339
5340     
/* Attach the onxxx handlers. These are declared statically so
5341      * they work with
static code transformers like Caja.
5342      */

5343     _attachHandlers: function(inst) {
5344         
var stepMonths = this._get(inst, "stepMonths"),
5345             id =
"#" + inst.id.replace( /\\\\/g, "\\" );
5346         inst.dpDiv.find(
"[data-handler]").map(function () {
5347             
var handler = {
5348                 prev: function () {
5349                     $.datepicker._adjustDate(id, -stepMonths,
"M");
5350                 },
5351                 next: function () {
5352                     $.datepicker._adjustDate(id, +stepMonths,
"M");
5353                 },
5354                 hide: function () {
5355                     $.datepicker._hideDatepicker();
5356                 },
5357                 today: function () {
5358                     $.datepicker._gotoToday(id);
5359                 },
5360                 selectDay: function () {
5361                     $.datepicker._selectDay(id, +
this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
5362                     
return false;
5363                 },
5364                 selectMonth: function () {
5365                     $.datepicker._selectMonthYear(id,
this, "M");
5366                     
return false;
5367                 },
5368                 selectYear: function () {
5369                     $.datepicker._selectMonthYear(id,
this, "Y");
5370                     
return false;
5371                 }
5372             };
5373             $(
this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
5374         });
5375     },
5376
5377     
/* Generate the HTML for the current state of the date picker. */
5378     _generateHTML: function(inst) {
5379         
var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
5380             controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
5381             monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
5382             selectOtherMonths, defaultDate, html, dow, row,
group, col, selectedDate,
5383             cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
5384             printDate, dRow, tbody, daySettings, otherMonth, unselectable,
5385             tempDate =
new Date(),
5386             today =
this._daylightSavingAdjust(
5387                 
new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
5388             isRTL =
this._get(inst, "isRTL"),
5389             showButtonPanel =
this._get(inst, "showButtonPanel"),
5390             hideIfNoPrevNext =
this._get(inst, "hideIfNoPrevNext"),
5391             navigationAsDateFormat =
this._get(inst, "navigationAsDateFormat"),
5392             numMonths =
this._getNumberOfMonths(inst),
5393             showCurrentAtPos =
this._get(inst, "showCurrentAtPos"),
5394             stepMonths =
this._get(inst, "stepMonths"),
5395             isMultiMonth = (numMonths[
0] !== 1 || numMonths[1] !== 1),
5396             currentDate =
this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
5397                 
new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
5398             minDate =
this._getMinMaxDate(inst, "min"),
5399             maxDate =
this._getMinMaxDate(inst, "max"),
5400             drawMonth = inst.drawMonth - showCurrentAtPos,
5401             drawYear = inst.drawYear;
5402
5403         
if (drawMonth < 0) {
5404             drawMonth +=
12;
5405             drawYear--;
5406         }
5407         
if (maxDate) {
5408             maxDraw =
this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
5409                 maxDate.getMonth() - (numMonths[
0] * numMonths[1]) + 1, maxDate.getDate()));
5410             maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
5411             
while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
5412                 drawMonth--;
5413                 
if (drawMonth < 0) {
5414                     drawMonth =
11;
5415                     drawYear--;
5416                 }
5417             }
5418         }
5419         inst.drawMonth = drawMonth;
5420         inst.drawYear = drawYear;
5421
5422         prevText =
this._get(inst, "prevText");
5423         prevText = (!navigationAsDateFormat ? prevText :
this.formatDate(prevText,
5424             
this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
5425             
this._getFormatConfig(inst)));
5426
5427         prev = (
this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
5428             
"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
5429             
" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
5430             (hideIfNoPrevNext ?
"" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
5431
5432         nextText =
this._get(inst, "nextText");
5433         nextText = (!navigationAsDateFormat ? nextText :
this.formatDate(nextText,
5434             
this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
5435             
this._getFormatConfig(inst)));
5436
5437         next = (
this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
5438             
"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
5439             
" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
5440             (hideIfNoPrevNext ?
"" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
5441
5442         currentText =
this._get(inst, "currentText");
5443         gotoDate = (
this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
5444         currentText = (!navigationAsDateFormat ? currentText :
5445             
this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
5446
5447         controls = (!inst.inline ?
"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
5448             
this._get(inst, "closeText") + "</button>" : "");
5449
5450         buttonPanel = (showButtonPanel) ?
"<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
5451             (
this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
5452             
">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
5453
5454         firstDay = parseInt(
this._get(inst, "firstDay"),10);
5455         firstDay = (isNaN(firstDay) ?
0 : firstDay);
5456
5457         showWeek =
this._get(inst, "showWeek");
5458         dayNames =
this._get(inst, "dayNames");
5459         dayNamesMin =
this._get(inst, "dayNamesMin");
5460         monthNames =
this._get(inst, "monthNames");
5461         monthNamesShort =
this._get(inst, "monthNamesShort");
5462         beforeShowDay =
this._get(inst, "beforeShowDay");
5463         showOtherMonths =
this._get(inst, "showOtherMonths");
5464         selectOtherMonths =
this._get(inst, "selectOtherMonths");
5465         defaultDate =
this._getDefaultDate(inst);
5466         html =
"";
5467         dow;
5468         
for (row = 0; row < numMonths[0]; row++) {
5469             
group = "";
5470             
this.maxRows = 4;
5471             
for (col = 0; col < numMonths[1]; col++) {
5472                 selectedDate =
this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
5473                 cornerClass =
" ui-corner-all";
5474                 calender =
"";
5475                 
if (isMultiMonth) {
5476                     calender +=
"<div class='ui-datepicker-group";
5477                     
if (numMonths[1] > 1) {
5478                         
switch (col) {
5479                             
case 0: calender += " ui-datepicker-group-first";
5480                                 cornerClass =
" ui-corner-" + (isRTL ? "right" : "left"); break;
5481                             
case numMonths[1]-1: calender += " ui-datepicker-group-last";
5482                                 cornerClass =
" ui-corner-" + (isRTL ? "left" : "right"); break;
5483                             
default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
5484                         }
5485                     }
5486                     calender +=
"'>";
5487                 }
5488                 calender +=
"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
5489                     (/all|left/.test(cornerClass) && row ===
0 ? (isRTL ? next : prev) : "") +
5490                     (/all|right/.test(cornerClass) && row ===
0 ? (isRTL ? prev : next) : "") +
5491                     
this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
5492                     row >
0 || col > 0, monthNames, monthNamesShort) + // draw month headers
5493                     
"</div><table class='ui-datepicker-calendar'><thead>" +
5494                     
"<tr>";
5495                 thead = (showWeek ?
"<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
5496                 
for (dow = 0; dow < 7; dow++) { // days of the week
5497                     day = (dow + firstDay) %
7;
5498                     thead +=
"<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
5499                         
"<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
5500                 }
5501                 calender += thead +
"</tr></thead><tbody>";
5502                 daysInMonth =
this._getDaysInMonth(drawYear, drawMonth);
5503                 
if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
5504                     inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
5505                 }
5506                 leadDays = (
this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
5507                 curRows = Math.ceil((leadDays + daysInMonth) /
7); // calculate the number of rows to generate
5508                 numRows = (isMultiMonth ?
this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
5509                 
this.maxRows = numRows;
5510                 printDate =
this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
5511                 
for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
5512                     calender +=
"<tr>";
5513                     tbody = (!showWeek ?
"" : "<td class='ui-datepicker-week-col'>" +
5514                         
this._get(inst, "calculateWeek")(printDate) + "</td>");
5515                     
for (dow = 0; dow < 7; dow++) { // create date picker days
5516                         daySettings = (beforeShowDay ?
5517                             beforeShowDay.apply((inst.input ? inst.input[
0] : null), [printDate]) : [true, ""]);
5518                         otherMonth = (printDate.getMonth() !== drawMonth);
5519                         unselectable = (otherMonth && !selectOtherMonths) || !daySettings[
0] ||
5520                             (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
5521                         tbody +=
"<td class='" +
5522                             ((dow + firstDay +
6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
5523                             (otherMonth ?
" ui-datepicker-other-month" : "") + // highlight days from other months
5524                             ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) ||
// user pressed key
5525                             (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
5526                             
// or defaultDate is current printedDate and defaultDate is selectedDate
5527                             
" " + this._dayOverClass : "") + // highlight selected day
5528                             (unselectable ?
" " + this._unselectableClass + " ui-state-disabled": "") + // highlight unselectable days
5529                             (otherMonth && !showOtherMonths ?
"" : " " + daySettings[1] + // highlight custom dates
5530                             (printDate.getTime() === currentDate.getTime() ?
" " + this._currentClass : "") + // highlight selected day
5531                             (printDate.getTime() === today.getTime() ?
" ui-datepicker-today" : "")) + "'" + // highlight today (if different)
5532                             ((!otherMonth || showOtherMonths) && daySettings[
2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
5533                             (unselectable ? "" : "
data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
5534                             (otherMonth && !showOtherMonths ? "
&#xa0;" : // display for other months
5535                             (unselectable ? "
<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
5536                             (printDate.getTime() === today.getTime() ?
" ui-state-highlight" : "") +
5537                             (printDate.getTime() === currentDate.getTime() ?
" ui-state-active" : "") + // highlight selected day
5538                             (otherMonth ?
" ui-priority-secondary" : "") + // distinguish dates from other months
5539                             
"' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
5540                         printDate.setDate(printDate.getDate() +
1);
5541                         printDate =
this._daylightSavingAdjust(printDate);
5542                     }
5543                     calender += tbody +
"</tr>";
5544                 }
5545                 drawMonth++;
5546                 
if (drawMonth > 11) {
5547                     drawMonth =
0;
5548                     drawYear++;
5549                 }
5550                 calender +=
"</tbody></table>" + (isMultiMonth ? "</div>" +
5551                             ((numMonths[
0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
5552                 
group += calender;
5553             }
5554             html +=
group;
5555         }
5556         html += buttonPanel;
5557         inst._keyEvent =
false;
5558         
return html;
5559     },
5560
5561     
/* Generate the month and year header. */
5562     _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
5563             secondary, monthNames, monthNamesShort) {
5564
5565         
var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
5566             changeMonth =
this._get(inst, "changeMonth"),
5567             changeYear =
this._get(inst, "changeYear"),
5568             showMonthAfterYear =
this._get(inst, "showMonthAfterYear"),
5569             html =
"<div class='ui-datepicker-title'>",
5570             monthHtml =
"";
5571
5572         // month selection
5573         
if (secondary || !changeMonth) {
5574             monthHtml +=
"<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
5575         }
else {
5576             inMinYear = (minDate && minDate.getFullYear() === drawYear);
5577             inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
5578             monthHtml +=
"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
5579             
for ( month = 0; month < 12; month++) {
5580                 
if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
5581                     monthHtml +=
"<option value='" + month + "'" +
5582                         (month === drawMonth ?
" selected='selected'" : "") +
5583                         
">" + monthNamesShort[month] + "</option>";
5584                 }
5585             }
5586             monthHtml +=
"</select>";
5587         }
5588
5589         
if (!showMonthAfterYear) {
5590             html += monthHtml + (secondary || !(changeMonth && changeYear) ?
"&#xa0;" : "");
5591         }
5592
5593         // year selection
5594         
if ( !inst.yearshtml ) {
5595             inst.yearshtml =
"";
5596             
if (secondary || !changeYear) {
5597                 html +=
"<span class='ui-datepicker-year'>" + drawYear + "</span>";
5598             }
else {
5599                 // determine range of years to display
5600                 years =
this._get(inst, "yearRange").split(":");
5601                 thisYear =
new Date().getFullYear();
5602                 determineYear = function(
value) {
5603                     
var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
5604                         (
value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
5605                         parseInt(
value, 10)));
5606                     
return (isNaN(year) ? thisYear : year);
5607                 };
5608                 year = determineYear(years[
0]);
5609                 endYear = Math.max(year, determineYear(years[
1] || ""));
5610                 year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
5611                 endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
5612                 inst.yearshtml +=
"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
5613                 
for (; year <= endYear; year++) {
5614                     inst.yearshtml +=
"<option value='" + year + "'" +
5615                         (year === drawYear ?
" selected='selected'" : "") +
5616                         
">" + year + "</option>";
5617                 }
5618                 inst.yearshtml +=
"</select>";
5619
5620                 html += inst.yearshtml;
5621                 inst.yearshtml =
null;
5622             }
5623         }
5624
5625         html +=
this._get(inst, "yearSuffix");
5626         
if (showMonthAfterYear) {
5627             html += (secondary || !(changeMonth && changeYear) ?
"&#xa0;" : "") + monthHtml;
5628         }
5629         html +=
"</div>"; // Close datepicker_header
5630         
return html;
5631     },
5632
5633     
/* Adjust one of the date sub-fields. */
5634     _adjustInstDate: function(inst, offset, period) {
5635         
var year = inst.drawYear + (period === "Y" ? offset : 0),
5636             month = inst.drawMonth + (period ===
"M" ? offset : 0),
5637             day = Math.min(inst.selectedDay,
this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
5638             date =
this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
5639
5640         inst.selectedDay = date.getDate();
5641         inst.drawMonth = inst.selectedMonth = date.getMonth();
5642         inst.drawYear = inst.selectedYear = date.getFullYear();
5643         
if (period === "M" || period === "Y") {
5644             
this._notifyChange(inst);
5645         }
5646     },
5647
5648     
/* Ensure a date is within any min/max bounds. */
5649     _restrictMinMax: function(inst, date) {
5650         
var minDate = this._getMinMaxDate(inst, "min"),
5651             maxDate =
this._getMinMaxDate(inst, "max"),
5652             newDate = (minDate && date < minDate ? minDate : date);
5653         
return (maxDate && newDate > maxDate ? maxDate : newDate);
5654     },
5655
5656     
/* Notify change of month/year. */
5657     _notifyChange: function(inst) {
5658         
var onChange = this._get(inst, "onChangeMonthYear");
5659         
if (onChange) {
5660             onChange.apply((inst.input ? inst.input[
0] : null),
5661                 [inst.selectedYear, inst.selectedMonth +
1, inst]);
5662         }
5663     },
5664
5665     
/* Determine the number of months to show. */
5666     _getNumberOfMonths: function(inst) {
5667         
var numMonths = this._get(inst, "numberOfMonths");
5668         
return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
5669     },
5670
5671     
/* Determine the current maximum date - ensure no time components are set. */
5672     _getMinMaxDate: function(inst, minMax) {
5673         
return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
5674     },
5675
5676     
/* Find the number of days in a given month. */
5677     _getDaysInMonth: function(year, month) {
5678         
return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
5679     },
5680
5681     
/* Find the day of the week of the first of a month. */
5682     _getFirstDayOfMonth: function(year, month) {
5683         
return new Date(year, month, 1).getDay();
5684     },
5685
5686     
/* Determines if we should allow a "next/prev" month display change. */
5687     _canAdjustMonth: function(inst, offset, curYear, curMonth) {
5688         
var numMonths = this._getNumberOfMonths(inst),
5689             date =
this._daylightSavingAdjust(new Date(curYear,
5690             curMonth + (offset <
0 ? offset : numMonths[0] * numMonths[1]), 1));
5691
5692         
if (offset < 0) {
5693             date.setDate(
this._getDaysInMonth(date.getFullYear(), date.getMonth()));
5694         }
5695         
return this._isInRange(inst, date);
5696     },
5697
5698     
/* Is the given date in the accepted range? */
5699     _isInRange: function(inst, date) {
5700         
var yearSplit, currentYear,
5701             minDate =
this._getMinMaxDate(inst, "min"),
5702             maxDate =
this._getMinMaxDate(inst, "max"),
5703             minYear =
null,
5704             maxYear =
null,
5705             years =
this._get(inst, "yearRange");
5706             
if (years){
5707                 yearSplit = years.split(
":");
5708                 currentYear =
new Date().getFullYear();
5709                 minYear = parseInt(yearSplit[
0], 10);
5710                 maxYear = parseInt(yearSplit[
1], 10);
5711                 
if ( yearSplit[0].match(/[+\-].*/) ) {
5712                     minYear += currentYear;
5713                 }
5714                 
if ( yearSplit[1].match(/[+\-].*/) ) {
5715                     maxYear += currentYear;
5716                 }
5717             }
5718
5719         
return ((!minDate || date.getTime() >= minDate.getTime()) &&
5720             (!maxDate || date.getTime() <= maxDate.getTime()) &&
5721             (!minYear || date.getFullYear() >= minYear) &&
5722             (!maxYear || date.getFullYear() <= maxYear));
5723     },
5724
5725     
/* Provide the configuration settings for formatting/parsing. */
5726     _getFormatConfig: function(inst) {
5727         
var shortYearCutoff = this._get(inst, "shortYearCutoff");
5728         shortYearCutoff = (
typeof shortYearCutoff !== "string" ? shortYearCutoff :
5729             
new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
5730         
return {shortYearCutoff: shortYearCutoff,
5731             dayNamesShort:
this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
5732             monthNamesShort:
this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
5733     },
5734
5735     
/* Format the given date for display. */
5736     _formatDate: function(inst, day, month, year) {
5737         
if (!day) {
5738             inst.currentDay = inst.selectedDay;
5739             inst.currentMonth = inst.selectedMonth;
5740             inst.currentYear = inst.selectedYear;
5741         }
5742         
var date = (day ? (typeof day === "object" ? day :
5743             
this._daylightSavingAdjust(new Date(year, month, day))) :
5744             
this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
5745         
return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
5746     }
5747 });

5748
5749 /*
5750  * Bind hover events
for datepicker elements.
5751  * Done via
delegate so the binding only occurs once in the lifetime of the parent div.
5752  * Global datepicker_instActive,
set by _updateDatepicker allows the handlers to find their way back to the active picker.
5753  */

5754 function datepicker_bindHover(dpDiv) {
5755     
var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
5756     
return dpDiv.delegate(selector, "mouseout", function() {
5757             $(
this).removeClass("ui-state-hover");
5758             
if (this.className.indexOf("ui-datepicker-prev") !== -1) {
5759                 $(
this).removeClass("ui-datepicker-prev-hover");
5760             }
5761             
if (this.className.indexOf("ui-datepicker-next") !== -1) {
5762                 $(
this).removeClass("ui-datepicker-next-hover");
5763             }
5764         })
5765         .
delegate( selector, "mouseover", datepicker_handleMouseover );
5766 }
5767
5768 function datepicker_handleMouseover() {
5769     
if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
5770         $(
this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
5771         $(
this).addClass("ui-state-hover");
5772         
if (this.className.indexOf("ui-datepicker-prev") !== -1) {
5773             $(
this).addClass("ui-datepicker-prev-hover");
5774         }
5775         
if (this.className.indexOf("ui-datepicker-next") !== -1) {
5776             $(
this).addClass("ui-datepicker-next-hover");
5777         }
5778     }
5779 }

5780
5781 /* jQuery extend now ignores nulls! */

5782 function datepicker_extendRemove(target, props) {
5783     $.extend(target, props);
5784     
for (var name in props) {
5785         
if (props[name] == null) {
5786             target[name] = props[name];
5787         }
5788     }
5789     
return target;
5790 }

5791
5792 /* Invoke the datepicker functionality.
5793    @param options
string - a command, optionally followed by additional parameters or
5794                     Object - settings
for attaching new datepicker functionality
5795    @
return jQuery object */
5796 $.fn.datepicker = function(options){
5797
5798     
/* Verify an empty collection wasn't passed - Fixes #6976 */
5799     
if ( !this.length ) {
5800         
return this;
5801     }
5802
5803     
/* Initialise the date picker. */
5804     
if (!$.datepicker.initialized) {
5805         $(document).mousedown($.datepicker._checkExternalClick);
5806         $.datepicker.initialized =
true;
5807     }
5808
5809     
/* Append datepicker main container to body if not exist. */
5810     
if ($("#"+$.datepicker._mainDivId).length === 0) {
5811         $(
"body").append($.datepicker.dpDiv);
5812     }
5813
5814     
var otherArgs = Array.prototype.slice.call(arguments, 1);
5815     
if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
5816         
return $.datepicker["_" + options + "Datepicker"].
5817             apply($.datepicker, [
this[0]].concat(otherArgs));
5818     }
5819     
if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
5820         
return $.datepicker["_" + options + "Datepicker"].
5821             apply($.datepicker, [
this[0]].concat(otherArgs));
5822     }
5823     
return this.each(function() {
5824         
typeof options === "string" ?
5825             $.datepicker[
"_" + options + "Datepicker"].
5826                 apply($.datepicker, [
this].concat(otherArgs)) :
5827             $.datepicker._attachDatepicker(
this, options);
5828     });
5829 };
5830
5831 $.datepicker =
new Datepicker(); // singleton instance
5832 $.datepicker.initialized =
false;
5833 $.datepicker.uuid =
new Date().getTime();
5834 $.datepicker.version =
"1.11.4";
5835
5836 var
datepicker = $.datepicker;
5837
5838
5839 /*!
5840  * jQuery UI Draggable
1.11.4
5841  * http://jqueryui.com
5842  *
5843  * Copyright jQuery Foundation and other contributors
5844  * Released under the MIT license.
5845  * http://jquery.org/license
5846  *
5847  * http://api.jqueryui.com/draggable/
5848  */

5849
5850
5851 $.widget(
"ui.draggable", $.ui.mouse, {
5852     version:
"1.11.4",
5853     widgetEventPrefix:
"drag",
5854     options: {
5855         addClasses:
true,
5856         appendTo:
"parent",
5857         axis:
false,
5858         connectToSortable:
false,
5859         containment:
false,
5860         cursor:
"auto",
5861         cursorAt:
false,
5862         grid:
false,
5863         handle:
false,
5864         helper:
"original",
5865         iframeFix:
false,
5866         opacity:
false,
5867         refreshPositions:
false,
5868         revert:
false,
5869         revertDuration:
500,
5870         scope:
"default",
5871         scroll:
true,
5872         scrollSensitivity:
20,
5873         scrollSpeed:
20,
5874         snap:
false,
5875         snapMode:
"both",
5876         snapTolerance:
20,
5877         stack:
false,
5878         zIndex:
false,
5879
5880         
// callbacks
5881         drag:
null,
5882         start:
null,
5883         stop:
null
5884     },
5885     _create: function() {
5886
5887         
if ( this.options.helper === "original" ) {
5888             
this._setPositionRelative();
5889         }
5890         
if (this.options.addClasses){
5891             
this.element.addClass("ui-draggable");
5892         }
5893         
if (this.options.disabled){
5894             
this.element.addClass("ui-draggable-disabled");
5895         }
5896         
this._setHandleClassName();
5897
5898         
this._mouseInit();
5899     },
5900
5901     _setOption: function( key,
value ) {
5902         
this._super( key, value );
5903         
if ( key === "handle" ) {
5904             
this._removeHandleClassName();
5905             
this._setHandleClassName();
5906         }
5907     },
5908
5909     _destroy: function() {
5910         
if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
5911             
this.destroyOnClear = true;
5912             
return;
5913         }
5914         
this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
5915         
this._removeHandleClassName();
5916         
this._mouseDestroy();
5917     },
5918
5919     _mouseCapture: function(
event) {
5920         
var o = this.options;
5921
5922         
this._blurActiveElement( event );
5923
5924         
// among others, prevent a drag on a resizable-handle
5925         
if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
5926             
return false;
5927         }
5928
5929         
//Quit if we're not on a valid handle
5930         
this.handle = this._getHandle(event);
5931         
if (!this.handle) {
5932             
return false;
5933         }
5934
5935         
this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
5936
5937         
return true;
5938
5939     },
5940
5941     _blockFrames: function( selector ) {
5942         
this.iframeBlocks = this.document.find( selector ).map(function() {
5943             
var iframe = $( this );
5944
5945             
return $( "<div>" )
5946                 .css(
"position", "absolute" )
5947                 .appendTo( iframe.parent() )
5948                 .outerWidth( iframe.outerWidth() )
5949                 .outerHeight( iframe.outerHeight() )
5950                 .offset( iframe.offset() )[
0 ];
5951         });
5952     },
5953
5954     _unblockFrames: function() {
5955         
if ( this.iframeBlocks ) {
5956             
this.iframeBlocks.remove();
5957             delete
this.iframeBlocks;
5958         }
5959     },
5960
5961     _blurActiveElement: function(
event ) {
5962         
var document = this.document[ 0 ];
5963
5964         
// Only need to blur if the event occurred on the draggable itself, see #10527
5965         
if ( !this.handleElement.is( event.target ) ) {
5966             
return;
5967         }
5968
5969         
// support: IE9
5970         
// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
5971         
try {
5972
5973             
// Support: IE9, IE10
5974             
// If the <body> is blurred, IE will switch windows, see #9520
5975             
if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
5976
5977                 
// Blur any element that currently has focus, see #4261
5978                 $( document.activeElement ).blur();
5979             }
5980         }
catch ( error ) {}
5981     },
5982
5983     _mouseStart: function(
event) {
5984
5985         
var o = this.options;
5986
5987         
//Create and append the visible helper
5988         
this.helper = this._createHelper(event);
5989
5990         
this.helper.addClass("ui-draggable-dragging");
5991
5992         
//Cache the helper size
5993         
this._cacheHelperProportions();
5994
5995         
//If ddmanager is used for droppables, set the global draggable
5996         
if ($.ui.ddmanager) {
5997             $.ui.ddmanager.current =
this;
5998         }
5999
6000         
/*
6001          * - Position generation -
6002          * This block generates everything position related - it
's the core of draggables.
6003          */

6004
6005         
//Cache the margins of the original element
6006         
this._cacheMargins();
6007
6008         
//Store the helper's css position
6009         
this.cssPosition = this.helper.css( "position" );
6010         
this.scrollParent = this.helper.scrollParent( true );
6011         
this.offsetParent = this.helper.offsetParent();
6012         
this.hasFixedAncestor = this.helper.parents().filter(function() {
6013                 
return $( this ).css( "position" ) === "fixed";
6014             }).length >
0;
6015
6016         
//The element's absolute position on the page minus margins
6017         
this.positionAbs = this.element.offset();
6018         
this._refreshOffsets( event );
6019
6020         
//Generate the original position
6021         
this.originalPosition = this.position = this._generatePosition( event, false );
6022         
this.originalPageX = event.pageX;
6023         
this.originalPageY = event.pageY;
6024
6025         
//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
6026         (o.cursorAt &&
this._adjustOffsetFromHelper(o.cursorAt));
6027
6028         
//Set a containment if given in the options
6029         
this._setContainment();
6030
6031         
//Trigger event + callbacks
6032         
if (this._trigger("start", event) === false) {
6033             
this._clear();
6034             
return false;
6035         }
6036
6037         
//Recache the helper size
6038         
this._cacheHelperProportions();
6039
6040         
//Prepare the droppable offsets
6041         
if ($.ui.ddmanager && !o.dropBehaviour) {
6042             $.ui.ddmanager.prepareOffsets(
this, event);
6043         }
6044
6045         
// Reset helper's right/bottom css if they're set and set explicit width/height instead
6046         
// as this prevents resizing of elements with right/bottom set (see #7772)
6047         
this._normalizeRightBottom();
6048
6049         
this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
6050
6051         
//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
6052         
if ( $.ui.ddmanager ) {
6053             $.ui.ddmanager.dragStart(
this, event);
6054         }
6055
6056         
return true;
6057     },
6058
6059     _refreshOffsets: function(
event ) {
6060         
this.offset = {
6061             top:
this.positionAbs.top - this.margins.top,
6062             left:
this.positionAbs.left - this.margins.left,
6063             scroll:
false,
6064             parent:
this._getParentOffset(),
6065             relative:
this._getRelativeOffset()
6066         };
6067
6068         
this.offset.click = {
6069             left:
event.pageX - this.offset.left,
6070             top:
event.pageY - this.offset.top
6071         };
6072     },
6073
6074     _mouseDrag: function(
event, noPropagation) {
6075         
// reset any necessary cached properties (see #5009)
6076         
if ( this.hasFixedAncestor ) {
6077             
this.offset.parent = this._getParentOffset();
6078         }
6079
6080         
//Compute the helpers position
6081         
this.position = this._generatePosition( event, true );
6082         
this.positionAbs = this._convertPositionTo("absolute");
6083
6084         
//Call plugins and callbacks and use the resulting position if something is returned
6085         
if (!noPropagation) {
6086             
var ui = this._uiHash();
6087             
if (this._trigger("drag", event, ui) === false) {
6088                 
this._mouseUp({});
6089                 
return false;
6090             }
6091             
this.position = ui.position;
6092         }
6093
6094         
this.helper[ 0 ].style.left = this.position.left + "px";
6095         
this.helper[ 0 ].style.top = this.position.top + "px";
6096
6097         
if ($.ui.ddmanager) {
6098             $.ui.ddmanager.drag(
this, event);
6099         }
6100
6101         
return false;
6102     },
6103
6104     _mouseStop: function(
event) {
6105
6106         
//If we are using droppables, inform the manager about the drop
6107         
var that = this,
6108             dropped =
false;
6109         
if ($.ui.ddmanager && !this.options.dropBehaviour) {
6110             dropped = $.ui.ddmanager.drop(
this, event);
6111         }
6112
6113         
//if a drop comes from outside (a sortable)
6114         
if (this.dropped) {
6115             dropped =
this.dropped;
6116             
this.dropped = false;
6117         }
6118
6119         
if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
6120             $(
this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
6121                 
if (that._trigger("stop", event) !== false) {
6122                     that._clear();
6123                 }
6124             });
6125         }
else {
6126             
if (this._trigger("stop", event) !== false) {
6127                 
this._clear();
6128             }
6129         }
6130
6131         
return false;
6132     },
6133
6134     _mouseUp: function(
event ) {
6135         
this._unblockFrames();
6136
6137         
//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
6138         
if ( $.ui.ddmanager ) {
6139             $.ui.ddmanager.dragStop(
this, event);
6140         }
6141
6142         
// Only need to focus if the event occurred on the draggable itself, see #10527
6143         
if ( this.handleElement.is( event.target ) ) {
6144             
// The interaction is over; whether or not the click resulted in a drag, focus the element
6145             
this.element.focus();
6146         }
6147
6148         
return $.ui.mouse.prototype._mouseUp.call(this, event);
6149     },
6150
6151     cancel: function() {
6152
6153         
if (this.helper.is(".ui-draggable-dragging")) {
6154             
this._mouseUp({});
6155         }
else {
6156             
this._clear();
6157         }
6158
6159         
return this;
6160
6161     },
6162
6163     _getHandle: function(
event) {
6164         
return this.options.handle ?
6165             !!$(
event.target ).closest( this.element.find( this.options.handle ) ).length :
6166             
true;
6167     },
6168
6169     _setHandleClassName: function() {
6170         
this.handleElement = this.options.handle ?
6171             
this.element.find( this.options.handle ) : this.element;
6172         
this.handleElement.addClass( "ui-draggable-handle" );
6173     },
6174
6175     _removeHandleClassName: function() {
6176         
this.handleElement.removeClass( "ui-draggable-handle" );
6177     },
6178
6179     _createHelper: function(
event) {
6180
6181         
var o = this.options,
6182             helperIsFunction = $.isFunction( o.helper ),
6183             helper = helperIsFunction ?
6184                 $( o.helper.apply(
this.element[ 0 ], [ event ] ) ) :
6185                 ( o.helper ===
"clone" ?
6186                     
this.element.clone().removeAttr( "id" ) :
6187                     
this.element );
6188
6189         
if (!helper.parents("body").length) {
6190             helper.appendTo((o.appendTo ===
"parent" ? this.element[0].parentNode : o.appendTo));
6191         }
6192
6193         
// http://bugs.jqueryui.com/ticket/9446
6194         
// a helper function can return the original element
6195         
// which wouldn't have been set to relative in _create
6196         
if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
6197             
this._setPositionRelative();
6198         }
6199
6200         
if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
6201             helper.css(
"position", "absolute");
6202         }
6203
6204         
return helper;
6205
6206     },
6207
6208     _setPositionRelative: function() {
6209         
if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
6210             
this.element[ 0 ].style.position = "relative";
6211         }
6212     },
6213
6214     _adjustOffsetFromHelper: function(obj) {
6215         
if (typeof obj === "string") {
6216             obj = obj.split(
" ");
6217         }
6218         
if ($.isArray(obj)) {
6219             obj = { left: +obj[
0], top: +obj[1] || 0 };
6220         }
6221         
if ("left" in obj) {
6222             
this.offset.click.left = obj.left + this.margins.left;
6223         }
6224         
if ("right" in obj) {
6225             
this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
6226         }
6227         
if ("top" in obj) {
6228             
this.offset.click.top = obj.top + this.margins.top;
6229         }
6230         
if ("bottom" in obj) {
6231             
this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
6232         }
6233     },
6234
6235     _isRootNode: function( element ) {
6236         
return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
6237     },
6238
6239     _getParentOffset: function() {
6240
6241         
//Get the offsetParent and cache its position
6242         
var po = this.offsetParent.offset(),
6243             document =
this.document[ 0 ];
6244
6245         
// This is a special case where we need to modify a offset calculated on start, since the following happened:
6246         
// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
6247         
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
6248         
// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
6249         
if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
6250             po.left +=
this.scrollParent.scrollLeft();
6251             po.top +=
this.scrollParent.scrollTop();
6252         }
6253
6254         
if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
6255             po = { top:
0, left: 0 };
6256         }
6257
6258         
return {
6259             top: po.top + (parseInt(
this.offsetParent.css("borderTopWidth"), 10) || 0),
6260             left: po.left + (parseInt(
this.offsetParent.css("borderLeftWidth"), 10) || 0)
6261         };
6262
6263     },
6264
6265     _getRelativeOffset: function() {
6266         
if ( this.cssPosition !== "relative" ) {
6267             
return { top: 0, left: 0 };
6268         }
6269
6270         
var p = this.element.position(),
6271             scrollIsRootNode =
this._isRootNode( this.scrollParent[ 0 ] );
6272
6273         
return {
6274             top: p.top - ( parseInt(
this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
6275             left: p.left - ( parseInt(
this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
6276         };
6277
6278     },
6279
6280     _cacheMargins: function() {
6281         
this.margins = {
6282             left: (parseInt(
this.element.css("marginLeft"), 10) || 0),
6283             top: (parseInt(
this.element.css("marginTop"), 10) || 0),
6284             right: (parseInt(
this.element.css("marginRight"), 10) || 0),
6285             bottom: (parseInt(
this.element.css("marginBottom"), 10) || 0)
6286         };
6287     },
6288
6289     _cacheHelperProportions: function() {
6290         
this.helperProportions = {
6291             width:
this.helper.outerWidth(),
6292             height:
this.helper.outerHeight()
6293         };
6294     },
6295
6296     _setContainment: function() {
6297
6298         
var isUserScrollable, c, ce,
6299             o =
this.options,
6300             document =
this.document[ 0 ];
6301
6302         
this.relativeContainer = null;
6303
6304         
if ( !o.containment ) {
6305             
this.containment = null;
6306             
return;
6307         }
6308
6309         
if ( o.containment === "window" ) {
6310             
this.containment = [
6311                 $( window ).scrollLeft() -
this.offset.relative.left - this.offset.parent.left,
6312                 $( window ).scrollTop() -
this.offset.relative.top - this.offset.parent.top,
6313                 $( window ).scrollLeft() + $( window ).width() -
this.helperProportions.width - this.margins.left,
6314                 $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) -
this.helperProportions.height - this.margins.top
6315             ];
6316             
return;
6317         }
6318
6319         
if ( o.containment === "document") {
6320             
this.containment = [
6321                 
0,
6322                 
0,
6323                 $( document ).width() -
this.helperProportions.width - this.margins.left,
6324                 ( $( document ).height() || document.body.parentNode.scrollHeight ) -
this.helperProportions.height - this.margins.top
6325             ];
6326             
return;
6327         }
6328
6329         
if ( o.containment.constructor === Array ) {
6330             
this.containment = o.containment;
6331             
return;
6332         }
6333
6334         
if ( o.containment === "parent" ) {
6335             o.containment =
this.helper[ 0 ].parentNode;
6336         }
6337
6338         c = $( o.containment );
6339         ce = c[
0 ];
6340
6341         
if ( !ce ) {
6342             
return;
6343         }
6344
6345         isUserScrollable = /(scroll|auto)/.test( c.css(
"overflow" ) );
6346
6347         
this.containment = [
6348             ( parseInt( c.css(
"borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
6349             ( parseInt( c.css(
"borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
6350             ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
6351                 ( parseInt( c.css(
"borderRightWidth" ), 10 ) || 0 ) -
6352                 ( parseInt( c.css(
"paddingRight" ), 10 ) || 0 ) -
6353                 
this.helperProportions.width -
6354                 
this.margins.left -
6355                 
this.margins.right,
6356             ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
6357                 ( parseInt( c.css(
"borderBottomWidth" ), 10 ) || 0 ) -
6358                 ( parseInt( c.css(
"paddingBottom" ), 10 ) || 0 ) -
6359                 
this.helperProportions.height -
6360                 
this.margins.top -
6361                 
this.margins.bottom
6362         ];
6363         
this.relativeContainer = c;
6364     },
6365
6366     _convertPositionTo: function(d, pos) {
6367
6368         
if (!pos) {
6369             pos =
this.position;
6370         }
6371
6372         
var mod = d === "absolute" ? 1 : -1,
6373             scrollIsRootNode =
this._isRootNode( this.scrollParent[ 0 ] );
6374
6375         
return {
6376             top: (
6377                 pos.top +
// The absolute mouse position
6378                 
this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
6379                 
this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
6380                 ( (
this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
6381             ),
6382             left: (
6383                 pos.left +
// The absolute mouse position
6384                 
this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
6385                 
this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
6386                 ( (
this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
6387             )
6388         };
6389
6390     },
6391
6392     _generatePosition: function(
event, constrainPosition ) {
6393
6394         
var containment, co, top, left,
6395             o =
this.options,
6396             scrollIsRootNode =
this._isRootNode( this.scrollParent[ 0 ] ),
6397             pageX =
event.pageX,
6398             pageY =
event.pageY;
6399
6400         
// Cache the scroll
6401         
if ( !scrollIsRootNode || !this.offset.scroll ) {
6402             
this.offset.scroll = {
6403                 top:
this.scrollParent.scrollTop(),
6404                 left:
this.scrollParent.scrollLeft()
6405             };
6406         }
6407
6408         
/*
6409          * - Position constraining -
6410          * Constrain the position to a mix of grid, containment.
6411          */

6412
6413         
// If we are not dragging yet, we won't check for options
6414         
if ( constrainPosition ) {
6415             
if ( this.containment ) {
6416                 
if ( this.relativeContainer ){
6417                     co =
this.relativeContainer.offset();
6418                     containment = [
6419                         
this.containment[ 0 ] + co.left,
6420                         
this.containment[ 1 ] + co.top,
6421                         
this.containment[ 2 ] + co.left,
6422                         
this.containment[ 3 ] + co.top
6423                     ];
6424                 }
else {
6425                     containment =
this.containment;
6426                 }
6427
6428                 
if (event.pageX - this.offset.click.left < containment[0]) {
6429                     pageX = containment[
0] + this.offset.click.left;
6430                 }
6431                 
if (event.pageY - this.offset.click.top < containment[1]) {
6432                     pageY = containment[
1] + this.offset.click.top;
6433                 }
6434                 
if (event.pageX - this.offset.click.left > containment[2]) {
6435                     pageX = containment[
2] + this.offset.click.left;
6436                 }
6437                 
if (event.pageY - this.offset.click.top > containment[3]) {
6438                     pageY = containment[
3] + this.offset.click.top;
6439                 }
6440             }
6441
6442             
if (o.grid) {
6443                 
//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
6444                 top = o.grid[
1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
6445                 pageY = containment ? ((top -
this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
6446
6447                 left = o.grid[
0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
6448                 pageX = containment ? ((left -
this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
6449             }
6450
6451             
if ( o.axis === "y" ) {
6452                 pageX =
this.originalPageX;
6453             }
6454
6455             
if ( o.axis === "x" ) {
6456                 pageY =
this.originalPageY;
6457             }
6458         }
6459
6460         
return {
6461             top: (
6462                 pageY -
// The absolute mouse position
6463                 
this.offset.click.top - // Click offset (relative to the element)
6464                 
this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
6465                 
this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
6466                 (
this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
6467             ),
6468             left: (
6469                 pageX -
// The absolute mouse position
6470                 
this.offset.click.left - // Click offset (relative to the element)
6471                 
this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
6472                 
this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
6473                 (
this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
6474             )
6475         };
6476
6477     },
6478
6479     _clear: function() {
6480         
this.helper.removeClass("ui-draggable-dragging");
6481         
if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
6482             
this.helper.remove();
6483         }
6484         
this.helper = null;
6485         
this.cancelHelperRemoval = false;
6486         
if ( this.destroyOnClear ) {
6487             
this.destroy();
6488         }
6489     },
6490
6491     _normalizeRightBottom: function() {
6492         
if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
6493             
this.helper.width( this.helper.width() );
6494             
this.helper.css( "right", "auto" );
6495         }
6496         
if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
6497             
this.helper.height( this.helper.height() );
6498             
this.helper.css( "bottom", "auto" );
6499         }
6500     },
6501
6502     
// From now on bulk stuff - mainly helpers
6503
6504     _trigger: function( type,
event, ui ) {
6505         ui = ui ||
this._uiHash();
6506         $.ui.plugin.call(
this, type, [ event, ui, this ], true );
6507
6508         
// Absolute position and offset (see #6884 ) have to be recalculated after plugins
6509         
if ( /^(drag|start|stop)/.test( type ) ) {
6510             
this.positionAbs = this._convertPositionTo( "absolute" );
6511             ui.offset =
this.positionAbs;
6512         }
6513         
return $.Widget.prototype._trigger.call( this, type, event, ui );
6514     },
6515
6516     plugins: {},
6517
6518     _uiHash: function() {
6519         
return {
6520             helper:
this.helper,
6521             position:
this.position,
6522             originalPosition:
this.originalPosition,
6523             offset:
this.positionAbs
6524         };
6525     }
6526
6527 });
6528
6529 $.ui.plugin.
add( "draggable", "connectToSortable", {
6530     start: function(
event, ui, draggable ) {
6531         
var uiSortable = $.extend( {}, ui, {
6532             item: draggable.element
6533         });
6534
6535         draggable.sortables = [];
6536         $( draggable.options.connectToSortable ).each(function() {
6537             
var sortable = $( this ).sortable( "instance" );
6538
6539             
if ( sortable && !sortable.options.disabled ) {
6540                 draggable.sortables.push( sortable );
6541
6542                 
// refreshPositions is called at drag start to refresh the containerCache
6543                 
// which is used in drag. This ensures it's initialized and synchronized
6544                 
// with any changes that might have happened on the page since initialization.
6545                 sortable.refreshPositions();
6546                 sortable._trigger(
"activate", event, uiSortable);
6547             }
6548         });
6549     },
6550     stop: function(
event, ui, draggable ) {
6551         
var uiSortable = $.extend( {}, ui, {
6552             item: draggable.element
6553         });
6554
6555         draggable.cancelHelperRemoval =
false;
6556
6557         $.each( draggable.sortables, function() {
6558             
var sortable = this;
6559
6560             
if ( sortable.isOver ) {
6561                 sortable.isOver =
0;
6562
6563                 
// Allow this sortable to handle removing the helper
6564                 draggable.cancelHelperRemoval =
true;
6565                 sortable.cancelHelperRemoval =
false;
6566
6567                 
// Use _storedCSS To restore properties in the sortable,
6568                 
// as this also handles revert (#9675) since the draggable
6569                 
// may have modified them in unexpected ways (#8809)
6570                 sortable._storedCSS = {
6571                     position: sortable.placeholder.css(
"position" ),
6572                     top: sortable.placeholder.css(
"top" ),
6573                     left: sortable.placeholder.css(
"left" )
6574                 };
6575
6576                 sortable._mouseStop(
event);
6577
6578                 
// Once drag has ended, the sortable should return to using
6579                 
// its original helper, not the shared helper from draggable
6580                 sortable.options.helper = sortable.options._helper;
6581             }
else {
6582                 
// Prevent this Sortable from removing the helper.
6583                 
// However, don't set the draggable to remove the helper
6584                 
// either as another connected Sortable may yet handle the removal.
6585                 sortable.cancelHelperRemoval =
true;
6586
6587                 sortable._trigger(
"deactivate", event, uiSortable );
6588             }
6589         });
6590     },
6591     drag: function(
event, ui, draggable ) {
6592         $.each( draggable.sortables, function() {
6593             
var innermostIntersecting = false,
6594                 sortable =
this;
6595
6596             
// Copy over variables that sortable's _intersectsWith uses
6597             sortable.positionAbs = draggable.positionAbs;
6598             sortable.helperProportions = draggable.helperProportions;
6599             sortable.offset.click = draggable.offset.click;
6600
6601             
if ( sortable._intersectsWith( sortable.containerCache ) ) {
6602                 innermostIntersecting =
true;
6603
6604                 $.each( draggable.sortables, function() {
6605                     
// Copy over variables that sortable's _intersectsWith uses
6606                     
this.positionAbs = draggable.positionAbs;
6607                     
this.helperProportions = draggable.helperProportions;
6608                     
this.offset.click = draggable.offset.click;
6609
6610                     
if ( this !== sortable &&
6611                             
this._intersectsWith( this.containerCache ) &&
6612                             $.contains( sortable.element[
0 ], this.element[ 0 ] ) ) {
6613                         innermostIntersecting =
false;
6614                     }
6615
6616                     
return innermostIntersecting;
6617                 });
6618             }
6619
6620             
if ( innermostIntersecting ) {
6621                 
// If it intersects, we use a little isOver variable and set it once,
6622                 
// so that the move-in stuff gets fired only once.
6623                 
if ( !sortable.isOver ) {
6624                     sortable.isOver =
1;
6625
6626                     
// Store draggable's parent in case we need to reappend to it later.
6627                     draggable._parent = ui.helper.parent();
6628
6629                     sortable.currentItem = ui.helper
6630                         .appendTo( sortable.element )
6631                         .data(
"ui-sortable-item", true );
6632
6633                     
// Store helper option to later restore it
6634                     sortable.options._helper = sortable.options.helper;
6635
6636                     sortable.options.helper = function() {
6637                         
return ui.helper[ 0 ];
6638                     };
6639
6640                     
// Fire the start events of the sortable with our passed browser event,
6641                     
// and our own helper (so it doesn't create a new one)
6642                     
event.target = sortable.currentItem[ 0 ];
6643                     sortable._mouseCapture(
event, true );
6644                     sortable._mouseStart(
event, true, true );
6645
6646                     
// Because the browser event is way off the new appended portlet,
6647                     
// modify necessary variables to reflect the changes
6648                     sortable.offset.click.top = draggable.offset.click.top;
6649                     sortable.offset.click.left = draggable.offset.click.left;
6650                     sortable.offset.parent.left -= draggable.offset.parent.left -
6651                         sortable.offset.parent.left;
6652                     sortable.offset.parent.top -= draggable.offset.parent.top -
6653                         sortable.offset.parent.top;
6654
6655                     draggable._trigger(
"toSortable", event );
6656
6657                     
// Inform draggable that the helper is in a valid drop zone,
6658                     
// used solely in the revert option to handle "valid/invalid".
6659                     draggable.dropped = sortable.element;
6660
6661                     
// Need to refreshPositions of all sortables in the case that
6662                     
// adding to one sortable changes the location of the other sortables (#9675)
6663                     $.each( draggable.sortables, function() {
6664                         
this.refreshPositions();
6665                     });
6666
6667                     
// hack so receive/update callbacks work (mostly)
6668                     draggable.currentItem = draggable.element;
6669                     sortable.fromOutside = draggable;
6670                 }
6671
6672                 
if ( sortable.currentItem ) {
6673                     sortable._mouseDrag(
event );
6674                     
// Copy the sortable's position because the draggable's can potentially reflect
6675                     
// a relative position, while sortable is always absolute, which the dragged
6676                     
// element has now become. (#8809)
6677                     ui.position = sortable.position;
6678                 }
6679             }
else {
6680                 
// If it doesn't intersect with the sortable, and it intersected before,
6681                 
// we fake the drag stop of the sortable, but make sure it doesn't remove
6682                 
// the helper by using cancelHelperRemoval.
6683                 
if ( sortable.isOver ) {
6684
6685                     sortable.isOver =
0;
6686                     sortable.cancelHelperRemoval =
true;
6687
6688                     
// Calling sortable's mouseStop would trigger a revert,
6689                     
// so revert must be temporarily false until after mouseStop is called.
6690                     sortable.options._revert = sortable.options.revert;
6691                     sortable.options.revert =
false;
6692
6693                     sortable._trigger(
"out", event, sortable._uiHash( sortable ) );
6694                     sortable._mouseStop(
event, true );
6695
6696                     
// restore sortable behaviors that were modfied
6697                     
// when the draggable entered the sortable area (#9481)
6698                     sortable.options.revert = sortable.options._revert;
6699                     sortable.options.helper = sortable.options._helper;
6700
6701                     
if ( sortable.placeholder ) {
6702                         sortable.placeholder.
remove();
6703                     }
6704
6705                     
// Restore and recalculate the draggable's offset considering the sortable
6706                     
// may have modified them in unexpected ways. (#8809, #10669)
6707                     ui.helper.appendTo( draggable._parent );
6708                     draggable._refreshOffsets(
event );
6709                     ui.position = draggable._generatePosition(
event, true );
6710
6711                     draggable._trigger(
"fromSortable", event );
6712
6713                     
// Inform draggable that the helper is no longer in a valid drop zone
6714                     draggable.dropped =
false;
6715
6716                     
// Need to refreshPositions of all sortables just in case removing
6717                     
// from one sortable changes the location of other sortables (#9675)
6718                     $.each( draggable.sortables, function() {
6719                         
this.refreshPositions();
6720                     });
6721                 }
6722             }
6723         });
6724     }
6725 });
6726
6727 $.ui.plugin.
add("draggable", "cursor", {
6728     start: function(
event, ui, instance ) {
6729         
var t = $( "body" ),
6730             o = instance.options;
6731
6732         
if (t.css("cursor")) {
6733             o._cursor = t.css(
"cursor");
6734         }
6735         t.css(
"cursor", o.cursor);
6736     },
6737     stop: function(
event, ui, instance ) {
6738         
var o = instance.options;
6739         
if (o._cursor) {
6740             $(
"body").css("cursor", o._cursor);
6741         }
6742     }
6743 });
6744
6745 $.ui.plugin.
add("draggable", "opacity", {
6746     start: function(
event, ui, instance ) {
6747         
var t = $( ui.helper ),
6748             o = instance.options;
6749         
if (t.css("opacity")) {
6750             o._opacity = t.css(
"opacity");
6751         }
6752         t.css(
"opacity", o.opacity);
6753     },
6754     stop: function(
event, ui, instance ) {
6755         
var o = instance.options;
6756         
if (o._opacity) {
6757             $(ui.helper).css(
"opacity", o._opacity);
6758         }
6759     }
6760 });
6761
6762 $.ui.plugin.
add("draggable", "scroll", {
6763     start: function(
event, ui, i ) {
6764         
if ( !i.scrollParentNotHidden ) {
6765             i.scrollParentNotHidden = i.helper.scrollParent(
false );
6766         }
6767
6768         
if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
6769             i.overflowOffset = i.scrollParentNotHidden.offset();
6770         }
6771     },
6772     drag: function(
event, ui, i ) {
6773
6774         
var o = i.options,
6775             scrolled =
false,
6776             scrollParent = i.scrollParentNotHidden[
0 ],
6777             document = i.document[
0 ];
6778
6779         
if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
6780             
if ( !o.axis || o.axis !== "x" ) {
6781                 
if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
6782                     scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
6783                 }
else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
6784                     scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
6785                 }
6786             }
6787
6788             
if ( !o.axis || o.axis !== "y" ) {
6789                 
if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
6790                     scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
6791                 }
else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
6792                     scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
6793                 }
6794             }
6795
6796         }
else {
6797
6798             
if (!o.axis || o.axis !== "x") {
6799                 
if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
6800                     scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
6801                 }
else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
6802                     scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
6803                 }
6804             }
6805
6806             
if (!o.axis || o.axis !== "y") {
6807                 
if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
6808                     scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
6809                 }
else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
6810                     scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
6811                 }
6812             }
6813
6814         }
6815
6816         
if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
6817             $.ui.ddmanager.prepareOffsets(i,
event);
6818         }
6819
6820     }
6821 });
6822
6823 $.ui.plugin.
add("draggable", "snap", {
6824     start: function(
event, ui, i ) {
6825
6826         
var o = i.options;
6827
6828         i.snapElements = [];
6829
6830         $(o.snap.constructor !== String ? ( o.snap.items ||
":data(ui-draggable)" ) : o.snap).each(function() {
6831             
var $t = $(this),
6832                 $o = $t.offset();
6833             
if (this !== i.element[0]) {
6834                 i.snapElements.push({
6835                     item:
this,
6836                     width: $t.outerWidth(), height: $t.outerHeight(),
6837                     top: $o.top, left: $o.left
6838                 });
6839             }
6840         });
6841
6842     },
6843     drag: function(
event, ui, inst ) {
6844
6845         
var ts, bs, ls, rs, l, r, t, b, i, first,
6846             o = inst.options,
6847             d = o.snapTolerance,
6848             x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
6849             y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
6850
6851         
for (i = inst.snapElements.length - 1; i >= 0; i--){
6852
6853             l = inst.snapElements[i].left - inst.margins.left;
6854             r = l + inst.snapElements[i].width;
6855             t = inst.snapElements[i].top - inst.margins.top;
6856             b = t + inst.snapElements[i].height;
6857
6858             
if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
6859                 
if (inst.snapElements[i].snapping) {
6860                     (inst.options.snap.release && inst.options.snap.release.call(inst.element,
event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
6861                 }
6862                 inst.snapElements[i].snapping =
false;
6863                 
continue;
6864             }
6865
6866             
if (o.snapMode !== "inner") {
6867                 ts = Math.abs(t - y2) <= d;
6868                 bs = Math.abs(b - y1) <= d;
6869                 ls = Math.abs(l - x2) <= d;
6870                 rs = Math.abs(r - x1) <= d;
6871                 
if (ts) {
6872                     ui.position.top = inst._convertPositionTo(
"relative", { top: t - inst.helperProportions.height, left: 0 }).top;
6873                 }
6874                 
if (bs) {
6875                     ui.position.top = inst._convertPositionTo(
"relative", { top: b, left: 0 }).top;
6876                 }
6877                 
if (ls) {
6878                     ui.position.left = inst._convertPositionTo(
"relative", { top: 0, left: l - inst.helperProportions.width }).left;
6879                 }
6880                 
if (rs) {
6881                     ui.position.left = inst._convertPositionTo(
"relative", { top: 0, left: r }).left;
6882                 }
6883             }
6884
6885             first = (ts || bs || ls || rs);
6886
6887             
if (o.snapMode !== "outer") {
6888                 ts = Math.abs(t - y1) <= d;
6889                 bs = Math.abs(b - y2) <= d;
6890                 ls = Math.abs(l - x1) <= d;
6891                 rs = Math.abs(r - x2) <= d;
6892                 
if (ts) {
6893                     ui.position.top = inst._convertPositionTo(
"relative", { top: t, left: 0 }).top;
6894                 }
6895                 
if (bs) {
6896                     ui.position.top = inst._convertPositionTo(
"relative", { top: b - inst.helperProportions.height, left: 0 }).top;
6897                 }
6898                 
if (ls) {
6899                     ui.position.left = inst._convertPositionTo(
"relative", { top: 0, left: l }).left;
6900                 }
6901                 
if (rs) {
6902                     ui.position.left = inst._convertPositionTo(
"relative", { top: 0, left: r - inst.helperProportions.width }).left;
6903                 }
6904             }
6905
6906             
if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
6907                 (inst.options.snap.snap && inst.options.snap.snap.call(inst.element,
event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
6908             }
6909             inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
6910
6911         }
6912
6913     }
6914 });
6915
6916 $.ui.plugin.
add("draggable", "stack", {
6917     start: function(
event, ui, instance ) {
6918         
var min,
6919             o = instance.options,
6920             
group = $.makeArray($(o.stack)).sort(function(a, b) {
6921                 
return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
6922             });
6923
6924         
if (!group.length) { return; }
6925
6926         min = parseInt($(
group[0]).css("zIndex"), 10) || 0;
6927         $(
group).each(function(i) {
6928             $(
this).css("zIndex", min + i);
6929         });
6930         
this.css("zIndex", (min + group.length));
6931     }
6932 });
6933
6934 $.ui.plugin.
add("draggable", "zIndex", {
6935     start: function(
event, ui, instance ) {
6936         
var t = $( ui.helper ),
6937             o = instance.options;
6938
6939         
if (t.css("zIndex")) {
6940             o._zIndex = t.css(
"zIndex");
6941         }
6942         t.css(
"zIndex", o.zIndex);
6943     },
6944     stop: function(
event, ui, instance ) {
6945         
var o = instance.options;
6946
6947         
if (o._zIndex) {
6948             $(ui.helper).css(
"zIndex", o._zIndex);
6949         }
6950     }
6951 });

6952
6953 var
draggable = $.ui.draggable;
6954
6955
6956 /*!
6957  * jQuery UI Resizable
1.11.4
6958  * http://jqueryui.com
6959  *
6960  * Copyright jQuery Foundation and other contributors
6961  * Released under the MIT license.
6962  * http://jquery.org/license
6963  *
6964  * http://api.jqueryui.com/resizable/
6965  */

6966
6967
6968 $.widget(
"ui.resizable", $.ui.mouse, {
6969     version:
"1.11.4",
6970     widgetEventPrefix:
"resize",
6971     options: {
6972         alsoResize:
false,
6973         animate:
false,
6974         animateDuration:
"slow",
6975         animateEasing:
"swing",
6976         aspectRatio:
false,
6977         autoHide:
false,
6978         containment:
false,
6979         ghost:
false,
6980         grid:
false,
6981         handles:
"e,s,se",
6982         helper:
false,
6983         maxHeight:
null,
6984         maxWidth:
null,
6985         minHeight:
10,
6986         minWidth:
10,
6987         
// See #7960
6988         zIndex:
90,
6989
6990         
// callbacks
6991         resize:
null,
6992         start:
null,
6993         stop:
null
6994     },
6995
6996     _num: function(
value ) {
6997         
return parseInt( value, 10 ) || 0;
6998     },
6999
7000     _isNumber: function(
value ) {
7001         
return !isNaN( parseInt( value, 10 ) );
7002     },
7003
7004     _hasScroll: function( el, a ) {
7005
7006         
if ( $( el ).css( "overflow" ) === "hidden") {
7007             
return false;
7008         }
7009
7010         
var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
7011             has =
false;
7012
7013         
if ( el[ scroll ] > 0 ) {
7014             
return true;
7015         }
7016
7017         
// TODO: determine which cases actually cause this to happen
7018         
// if the element doesn't have the scroll set, see if it's possible to
7019         
// set the scroll
7020         el[ scroll ] =
1;
7021         has = ( el[ scroll ] >
0 );
7022         el[ scroll ] =
0;
7023         
return has;
7024     },
7025
7026     _create: function() {
7027
7028         
var n, i, handle, axis, hname,
7029             that =
this,
7030             o =
this.options;
7031         
this.element.addClass("ui-resizable");
7032
7033         $.extend(
this, {
7034             _aspectRatio: !!(o.aspectRatio),
7035             aspectRatio: o.aspectRatio,
7036             originalElement:
this.element,
7037             _proportionallyResizeElements: [],
7038             _helper: o.helper || o.ghost || o.animate ? o.helper ||
"ui-resizable-helper" : null
7039         });
7040
7041         
// Wrap the element if it cannot hold child nodes
7042         
if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
7043
7044             
this.element.wrap(
7045                 $(
"<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
7046                     position:
this.element.css("position"),
7047                     width:
this.element.outerWidth(),
7048                     height:
this.element.outerHeight(),
7049                     top:
this.element.css("top"),
7050                     left:
this.element.css("left")
7051                 })
7052             );
7053
7054             
this.element = this.element.parent().data(
7055                 
"ui-resizable", this.element.resizable( "instance" )
7056             );
7057
7058             
this.elementIsWrapper = true;
7059
7060             
this.element.css({
7061                 marginLeft:
this.originalElement.css("marginLeft"),
7062                 marginTop:
this.originalElement.css("marginTop"),
7063                 marginRight:
this.originalElement.css("marginRight"),
7064                 marginBottom:
this.originalElement.css("marginBottom")
7065             });
7066             
this.originalElement.css({
7067                 marginLeft:
0,
7068                 marginTop:
0,
7069                 marginRight:
0,
7070                 marginBottom:
0
7071             });
7072             
// support: Safari
7073             
// Prevent Safari textarea resize
7074             
this.originalResizeStyle = this.originalElement.css("resize");
7075             
this.originalElement.css("resize", "none");
7076
7077             
this._proportionallyResizeElements.push( this.originalElement.css({
7078                 position:
"static",
7079                 zoom:
1,
7080                 display:
"block"
7081             }) );
7082
7083             
// support: IE9
7084             
// avoid IE jump (hard set the margin)
7085             
this.originalElement.css({ margin: this.originalElement.css("margin") });
7086
7087             
this._proportionallyResize();
7088         }
7089
7090         
this.handles = o.handles ||
7091             ( !$(
".ui-resizable-handle", this.element).length ?
7092                 
"e,s,se" : {
7093                     n:
".ui-resizable-n",
7094                     e:
".ui-resizable-e",
7095                     s:
".ui-resizable-s",
7096                     w:
".ui-resizable-w",
7097                     se:
".ui-resizable-se",
7098                     sw:
".ui-resizable-sw",
7099                     ne:
".ui-resizable-ne",
7100                     nw:
".ui-resizable-nw"
7101                 } );
7102
7103         
this._handles = $();
7104         
if ( this.handles.constructor === String ) {
7105
7106             
if ( this.handles === "all") {
7107                 
this.handles = "n,e,s,w,se,sw,ne,nw";
7108             }
7109
7110             n =
this.handles.split(",");
7111             
this.handles = {};
7112
7113             
for (i = 0; i < n.length; i++) {
7114
7115                 handle = $.trim(n[i]);
7116                 hname =
"ui-resizable-" + handle;
7117                 axis = $(
"<div class='ui-resizable-handle " + hname + "'></div>");
7118
7119                 axis.css({ zIndex: o.zIndex });
7120
7121                 
// TODO : What's going on here?
7122                 
if ("se" === handle) {
7123                     axis.addClass(
"ui-icon ui-icon-gripsmall-diagonal-se");
7124                 }
7125
7126                 
this.handles[handle] = ".ui-resizable-" + handle;
7127                 
this.element.append(axis);
7128             }
7129
7130         }
7131
7132         
this._renderAxis = function(target) {
7133
7134             
var i, axis, padPos, padWrapper;
7135
7136             target = target ||
this.element;
7137
7138             
for (i in this.handles) {
7139
7140                 
if (this.handles[i].constructor === String) {
7141                     
this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
7142                 }
else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
7143                     
this.handles[ i ] = $( this.handles[ i ] );
7144                     
this._on( this.handles[ i ], { "mousedown": that._mouseDown });
7145                 }
7146
7147                 
if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
7148
7149                     axis = $(
this.handles[i], this.element);
7150
7151                     padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
7152
7153                     padPos = [
"padding",
7154                         /ne|nw|n/.test(i) ?
"Top" :
7155                         /se|sw|s/.test(i) ?
"Bottom" :
7156                         /^e$/.test(i) ?
"Right" : "Left" ].join("");
7157
7158                     target.css(padPos, padWrapper);
7159
7160                     
this._proportionallyResize();
7161                 }
7162
7163                 
this._handles = this._handles.add( this.handles[ i ] );
7164             }
7165         };
7166
7167         
// TODO: make renderAxis a prototype function
7168         
this._renderAxis(this.element);
7169
7170         
this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
7171         
this._handles.disableSelection();
7172
7173         
this._handles.mouseover(function() {
7174             
if (!that.resizing) {
7175                 
if (this.className) {
7176                     axis =
this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
7177                 }
7178                 that.axis = axis && axis[
1] ? axis[1] : "se";
7179             }
7180         });
7181
7182         
if (o.autoHide) {
7183             
this._handles.hide();
7184             $(
this.element)
7185                 .addClass(
"ui-resizable-autohide")
7186                 .mouseenter(function() {
7187                     
if (o.disabled) {
7188                         
return;
7189                     }
7190                     $(
this).removeClass("ui-resizable-autohide");
7191                     that._handles.show();
7192                 })
7193                 .mouseleave(function() {
7194                     
if (o.disabled) {
7195                         
return;
7196                     }
7197                     
if (!that.resizing) {
7198                         $(
this).addClass("ui-resizable-autohide");
7199                         that._handles.hide();
7200                     }
7201                 });
7202         }
7203
7204         
this._mouseInit();
7205     },
7206
7207     _destroy: function() {
7208
7209         
this._mouseDestroy();
7210
7211         
var wrapper,
7212             _destroy = function(exp) {
7213                 $(exp)
7214                     .removeClass(
"ui-resizable ui-resizable-disabled ui-resizable-resizing")
7215                     .removeData(
"resizable")
7216                     .removeData(
"ui-resizable")
7217                     .unbind(
".resizable")
7218                     .find(
".ui-resizable-handle")
7219                         .
remove();
7220             };
7221
7222         
// TODO: Unwrap at same DOM position
7223         
if (this.elementIsWrapper) {
7224             _destroy(
this.element);
7225             wrapper =
this.element;
7226             
this.originalElement.css({
7227                 position: wrapper.css(
"position"),
7228                 width: wrapper.outerWidth(),
7229                 height: wrapper.outerHeight(),
7230                 top: wrapper.css(
"top"),
7231                 left: wrapper.css(
"left")
7232             }).insertAfter( wrapper );
7233             wrapper.
remove();
7234         }
7235
7236         
this.originalElement.css("resize", this.originalResizeStyle);
7237         _destroy(
this.originalElement);
7238
7239         
return this;
7240     },
7241
7242     _mouseCapture: function(
event) {
7243         
var i, handle,
7244             capture =
false;
7245
7246         
for (i in this.handles) {
7247             handle = $(
this.handles[i])[0];
7248             
if (handle === event.target || $.contains(handle, event.target)) {
7249                 capture =
true;
7250             }
7251         }
7252
7253         
return !this.options.disabled && capture;
7254     },
7255
7256     _mouseStart: function(
event) {
7257
7258         
var curleft, curtop, cursor,
7259             o =
this.options,
7260             el =
this.element;
7261
7262         
this.resizing = true;
7263
7264         
this._renderProxy();
7265
7266         curleft =
this._num(this.helper.css("left"));
7267         curtop =
this._num(this.helper.css("top"));
7268
7269         
if (o.containment) {
7270             curleft += $(o.containment).scrollLeft() ||
0;
7271             curtop += $(o.containment).scrollTop() ||
0;
7272         }
7273
7274         
this.offset = this.helper.offset();
7275         
this.position = { left: curleft, top: curtop };
7276
7277         
this.size = this._helper ? {
7278                 width:
this.helper.width(),
7279                 height:
this.helper.height()
7280             } : {
7281                 width: el.width(),
7282                 height: el.height()
7283             };
7284
7285         
this.originalSize = this._helper ? {
7286                 width: el.outerWidth(),
7287                 height: el.outerHeight()
7288             } : {
7289                 width: el.width(),
7290                 height: el.height()
7291             };
7292
7293         
this.sizeDiff = {
7294             width: el.outerWidth() - el.width(),
7295             height: el.outerHeight() - el.height()
7296         };
7297
7298         
this.originalPosition = { left: curleft, top: curtop };
7299         
this.originalMousePosition = { left: event.pageX, top: event.pageY };
7300
7301         
this.aspectRatio = (typeof o.aspectRatio === "number") ?
7302             o.aspectRatio :
7303             ((
this.originalSize.width / this.originalSize.height) || 1);
7304
7305         cursor = $(
".ui-resizable-" + this.axis).css("cursor");
7306         $(
"body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
7307
7308         el.addClass(
"ui-resizable-resizing");
7309         
this._propagate("start", event);
7310         
return true;
7311     },
7312
7313     _mouseDrag: function(
event) {
7314
7315         
var data, props,
7316             smp =
this.originalMousePosition,
7317             a =
this.axis,
7318             dx = (
event.pageX - smp.left) || 0,
7319             dy = (
event.pageY - smp.top) || 0,
7320             trigger =
this._change[a];
7321
7322         
this._updatePrevProperties();
7323
7324         
if (!trigger) {
7325             
return false;
7326         }
7327
7328         data = trigger.apply(
this, [ event, dx, dy ]);
7329
7330         
this._updateVirtualBoundaries(event.shiftKey);
7331         
if (this._aspectRatio || event.shiftKey) {
7332             data =
this._updateRatio(data, event);
7333         }
7334
7335         data =
this._respectSize(data, event);
7336
7337         
this._updateCache(data);
7338
7339         
this._propagate("resize", event);
7340
7341         props =
this._applyChanges();
7342
7343         
if ( !this._helper && this._proportionallyResizeElements.length ) {
7344             
this._proportionallyResize();
7345         }
7346
7347         
if ( !$.isEmptyObject( props ) ) {
7348             
this._updatePrevProperties();
7349             
this._trigger( "resize", event, this.ui() );
7350             
this._applyChanges();
7351         }
7352
7353         
return false;
7354     },
7355
7356     _mouseStop: function(
event) {
7357
7358         
this.resizing = false;
7359         
var pr, ista, soffseth, soffsetw, s, left, top,
7360             o =
this.options, that = this;
7361
7362         
if (this._helper) {
7363
7364             pr =
this._proportionallyResizeElements;
7365             ista = pr.length && (/textarea/i).test(pr[
0].nodeName);
7366             soffseth = ista &&
this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
7367             soffsetw = ista ?
0 : that.sizeDiff.width;
7368
7369             s = {
7370                 width: (that.helper.width() - soffsetw),
7371                 height: (that.helper.height() - soffseth)
7372             };
7373             left = (parseInt(that.element.css(
"left"), 10) +
7374                 (that.position.left - that.originalPosition.left)) ||
null;
7375             top = (parseInt(that.element.css(
"top"), 10) +
7376                 (that.position.top - that.originalPosition.top)) ||
null;
7377
7378             
if (!o.animate) {
7379                 
this.element.css($.extend(s, { top: top, left: left }));
7380             }
7381
7382             that.helper.height(that.size.height);
7383             that.helper.width(that.size.width);
7384
7385             
if (this._helper && !o.animate) {
7386                 
this._proportionallyResize();
7387             }
7388         }
7389
7390         $(
"body").css("cursor", "auto");
7391
7392         
this.element.removeClass("ui-resizable-resizing");
7393
7394         
this._propagate("stop", event);
7395
7396         
if (this._helper) {
7397             
this.helper.remove();
7398         }
7399
7400         
return false;
7401
7402     },
7403
7404     _updatePrevProperties: function() {
7405         
this.prevPosition = {
7406             top:
this.position.top,
7407             left:
this.position.left
7408         };
7409         
this.prevSize = {
7410             width:
this.size.width,
7411             height:
this.size.height
7412         };
7413     },
7414
7415     _applyChanges: function() {
7416         
var props = {};
7417
7418         
if ( this.position.top !== this.prevPosition.top ) {
7419             props.top =
this.position.top + "px";
7420         }
7421         
if ( this.position.left !== this.prevPosition.left ) {
7422             props.left =
this.position.left + "px";
7423         }
7424         
if ( this.size.width !== this.prevSize.width ) {
7425             props.width =
this.size.width + "px";
7426         }
7427         
if ( this.size.height !== this.prevSize.height ) {
7428             props.height =
this.size.height + "px";
7429         }
7430
7431         
this.helper.css( props );
7432
7433         
return props;
7434     },
7435
7436     _updateVirtualBoundaries: function(forceAspectRatio) {
7437         
var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
7438             o =
this.options;
7439
7440         b = {
7441             minWidth:
this._isNumber(o.minWidth) ? o.minWidth : 0,
7442             maxWidth:
this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
7443             minHeight:
this._isNumber(o.minHeight) ? o.minHeight : 0,
7444             maxHeight:
this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
7445         };
7446
7447         
if (this._aspectRatio || forceAspectRatio) {
7448             pMinWidth = b.minHeight *
this.aspectRatio;
7449             pMinHeight = b.minWidth /
this.aspectRatio;
7450             pMaxWidth = b.maxHeight *
this.aspectRatio;
7451             pMaxHeight = b.maxWidth /
this.aspectRatio;
7452
7453             
if (pMinWidth > b.minWidth) {
7454                 b.minWidth = pMinWidth;
7455             }
7456             
if (pMinHeight > b.minHeight) {
7457                 b.minHeight = pMinHeight;
7458             }
7459             
if (pMaxWidth < b.maxWidth) {
7460                 b.maxWidth = pMaxWidth;
7461             }
7462             
if (pMaxHeight < b.maxHeight) {
7463                 b.maxHeight = pMaxHeight;
7464             }
7465         }
7466         
this._vBoundaries = b;
7467     },
7468
7469     _updateCache: function(data) {
7470         
this.offset = this.helper.offset();
7471         
if (this._isNumber(data.left)) {
7472             
this.position.left = data.left;
7473         }
7474         
if (this._isNumber(data.top)) {
7475             
this.position.top = data.top;
7476         }
7477         
if (this._isNumber(data.height)) {
7478             
this.size.height = data.height;
7479         }
7480         
if (this._isNumber(data.width)) {
7481             
this.size.width = data.width;
7482         }
7483     },
7484
7485     _updateRatio: function( data ) {
7486
7487         
var cpos = this.position,
7488             csize =
this.size,
7489             a =
this.axis;
7490
7491         
if (this._isNumber(data.height)) {
7492             data.width = (data.height *
this.aspectRatio);
7493         }
else if (this._isNumber(data.width)) {
7494             data.height = (data.width /
this.aspectRatio);
7495         }
7496
7497         
if (a === "sw") {
7498             data.left = cpos.left + (csize.width - data.width);
7499             data.top =
null;
7500         }
7501         
if (a === "nw") {
7502             data.top = cpos.top + (csize.height - data.height);
7503             data.left = cpos.left + (csize.width - data.width);
7504         }
7505
7506         
return data;
7507     },
7508
7509     _respectSize: function( data ) {
7510
7511         
var o = this._vBoundaries,
7512             a =
this.axis,
7513             ismaxw =
this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
7514             ismaxh =
this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
7515             isminw =
this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
7516             isminh =
this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
7517             dw =
this.originalPosition.left + this.originalSize.width,
7518             dh =
this.position.top + this.size.height,
7519             cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
7520         
if (isminw) {
7521             data.width = o.minWidth;
7522         }
7523         
if (isminh) {
7524             data.height = o.minHeight;
7525         }
7526         
if (ismaxw) {
7527             data.width = o.maxWidth;
7528         }
7529         
if (ismaxh) {
7530             data.height = o.maxHeight;
7531         }
7532
7533         
if (isminw && cw) {
7534             data.left = dw - o.minWidth;
7535         }
7536         
if (ismaxw && cw) {
7537             data.left = dw - o.maxWidth;
7538         }
7539         
if (isminh && ch) {
7540             data.top = dh - o.minHeight;
7541         }
7542         
if (ismaxh && ch) {
7543             data.top = dh - o.maxHeight;
7544         }
7545
7546         
// Fixing jump error on top/left - bug #2330
7547         
if (!data.width && !data.height && !data.left && data.top) {
7548             data.top =
null;
7549         }
else if (!data.width && !data.height && !data.top && data.left) {
7550             data.left =
null;
7551         }
7552
7553         
return data;
7554     },
7555
7556     _getPaddingPlusBorderDimensions: function( element ) {
7557         
var i = 0,
7558             widths = [],
7559             borders = [
7560                 element.css(
"borderTopWidth" ),
7561                 element.css(
"borderRightWidth" ),
7562                 element.css(
"borderBottomWidth" ),
7563                 element.css(
"borderLeftWidth" )
7564             ],
7565             paddings = [
7566                 element.css(
"paddingTop" ),
7567                 element.css(
"paddingRight" ),
7568                 element.css(
"paddingBottom" ),
7569                 element.css(
"paddingLeft" )
7570             ];
7571
7572         
for ( ; i < 4; i++ ) {
7573             widths[ i ] = ( parseInt( borders[ i ],
10 ) || 0 );
7574             widths[ i ] += ( parseInt( paddings[ i ],
10 ) || 0 );
7575         }
7576
7577         
return {
7578             height: widths[
0 ] + widths[ 2 ],
7579             width: widths[
1 ] + widths[ 3 ]
7580         };
7581     },
7582
7583     _proportionallyResize: function() {
7584
7585         
if (!this._proportionallyResizeElements.length) {
7586             
return;
7587         }
7588
7589         
var prel,
7590             i =
0,
7591             element =
this.helper || this.element;
7592
7593         
for ( ; i < this._proportionallyResizeElements.length; i++) {
7594
7595             prel =
this._proportionallyResizeElements[i];
7596
7597             
// TODO: Seems like a bug to cache this.outerDimensions
7598             
// considering that we are in a loop.
7599             
if (!this.outerDimensions) {
7600                 
this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
7601             }
7602
7603             prel.css({
7604                 height: (element.height() -
this.outerDimensions.height) || 0,
7605                 width: (element.width() -
this.outerDimensions.width) || 0
7606             });
7607
7608         }
7609
7610     },
7611
7612     _renderProxy: function() {
7613
7614         
var el = this.element, o = this.options;
7615         
this.elementOffset = el.offset();
7616
7617         
if (this._helper) {
7618
7619             
this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
7620
7621             
this.helper.addClass(this._helper).css({
7622                 width:
this.element.outerWidth() - 1,
7623                 height:
this.element.outerHeight() - 1,
7624                 position:
"absolute",
7625                 left:
this.elementOffset.left + "px",
7626                 top:
this.elementOffset.top + "px",
7627                 zIndex: ++o.zIndex
//TODO: Don't modify option
7628             });
7629
7630             
this.helper
7631                 .appendTo(
"body")
7632                 .disableSelection();
7633
7634         }
else {
7635             
this.helper = this.element;
7636         }
7637
7638     },
7639
7640     _change: {
7641         e: function(
event, dx) {
7642             
return { width: this.originalSize.width + dx };
7643         },
7644         w: function(
event, dx) {
7645             
var cs = this.originalSize, sp = this.originalPosition;
7646             
return { left: sp.left + dx, width: cs.width - dx };
7647         },
7648         n: function(
event, dx, dy) {
7649             
var cs = this.originalSize, sp = this.originalPosition;
7650             
return { top: sp.top + dy, height: cs.height - dy };
7651         },
7652         s: function(
event, dx, dy) {
7653             
return { height: this.originalSize.height + dy };
7654         },
7655         se: function(
event, dx, dy) {
7656             
return $.extend(this._change.s.apply(this, arguments),
7657                 
this._change.e.apply(this, [ event, dx, dy ]));
7658         },
7659         sw: function(
event, dx, dy) {
7660             
return $.extend(this._change.s.apply(this, arguments),
7661                 
this._change.w.apply(this, [ event, dx, dy ]));
7662         },
7663         ne: function(
event, dx, dy) {
7664             
return $.extend(this._change.n.apply(this, arguments),
7665                 
this._change.e.apply(this, [ event, dx, dy ]));
7666         },
7667         nw: function(
event, dx, dy) {
7668             
return $.extend(this._change.n.apply(this, arguments),
7669                 
this._change.w.apply(this, [ event, dx, dy ]));
7670         }
7671     },
7672
7673     _propagate: function(n,
event) {
7674         $.ui.plugin.call(
this, n, [ event, this.ui() ]);
7675         (n !==
"resize" && this._trigger(n, event, this.ui()));
7676     },
7677
7678     plugins: {},
7679
7680     ui: function() {
7681         
return {
7682             originalElement:
this.originalElement,
7683             element:
this.element,
7684             helper:
this.helper,
7685             position:
this.position,
7686             size:
this.size,
7687             originalSize:
this.originalSize,
7688             originalPosition:
this.originalPosition
7689         };
7690     }
7691
7692 });

7693
7694 /*
7695  * Resizable Extensions
7696  */

7697
7698 $.ui.plugin.
add("resizable", "animate", {
7699
7700     stop: function(
event ) {
7701         
var that = $(this).resizable( "instance" ),
7702             o = that.options,
7703             pr = that._proportionallyResizeElements,
7704             ista = pr.length && (/textarea/i).test(pr[
0].nodeName),
7705             soffseth = ista && that._hasScroll(pr[
0], "left") ? 0 : that.sizeDiff.height,
7706             soffsetw = ista ?
0 : that.sizeDiff.width,
7707             style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
7708             left = (parseInt(that.element.css(
"left"), 10) +
7709                 (that.position.left - that.originalPosition.left)) ||
null,
7710             top = (parseInt(that.element.css(
"top"), 10) +
7711                 (that.position.top - that.originalPosition.top)) ||
null;
7712
7713         that.element.animate(
7714             $.extend(style, top && left ? { top: top, left: left } : {}), {
7715                 duration: o.animateDuration,
7716                 easing: o.animateEasing,
7717                 step: function() {
7718
7719                     
var data = {
7720                         width: parseInt(that.element.css(
"width"), 10),
7721                         height: parseInt(that.element.css(
"height"), 10),
7722                         top: parseInt(that.element.css(
"top"), 10),
7723                         left: parseInt(that.element.css(
"left"), 10)
7724                     };
7725
7726                     
if (pr && pr.length) {
7727                         $(pr[
0]).css({ width: data.width, height: data.height });
7728                     }
7729
7730                     
// propagating resize, and updating values for each animation step
7731                     that._updateCache(data);
7732                     that._propagate(
"resize", event);
7733
7734                 }
7735             }
7736         );
7737     }
7738
7739 });
7740
7741 $.ui.plugin.
add( "resizable", "containment", {
7742
7743     start: function() {
7744         
var element, p, co, ch, cw, width, height,
7745             that = $(
this ).resizable( "instance" ),
7746             o = that.options,
7747             el = that.element,
7748             oc = o.containment,
7749             ce = ( oc instanceof $ ) ? oc.
get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
7750
7751         
if ( !ce ) {
7752             
return;
7753         }
7754
7755         that.containerElement = $( ce );
7756
7757         
if ( /document/.test( oc ) || oc === document ) {
7758             that.containerOffset = {
7759                 left:
0,
7760                 top:
0
7761             };
7762             that.containerPosition = {
7763                 left:
0,
7764                 top:
0
7765             };
7766
7767             that.parentData = {
7768                 element: $( document ),
7769                 left:
0,
7770                 top:
0,
7771                 width: $( document ).width(),
7772                 height: $( document ).height() || document.body.parentNode.scrollHeight
7773             };
7774         }
else {
7775             element = $( ce );
7776             p = [];
7777             $([
"Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
7778                 p[ i ] = that._num( element.css(
"padding" + name ) );
7779             });
7780
7781             that.containerOffset = element.offset();
7782             that.containerPosition = element.position();
7783             that.containerSize = {
7784                 height: ( element.innerHeight() - p[
3 ] ),
7785                 width: ( element.innerWidth() - p[
1 ] )
7786             };
7787
7788             co = that.containerOffset;
7789             ch = that.containerSize.height;
7790             cw = that.containerSize.width;
7791             width = ( that._hasScroll ( ce,
"left" ) ? ce.scrollWidth : cw );
7792             height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
7793
7794             that.parentData = {
7795                 element: ce,
7796                 left: co.left,
7797                 top: co.top,
7798                 width: width,
7799                 height: height
7800             };
7801         }
7802     },
7803
7804     resize: function(
event ) {
7805         
var woset, hoset, isParent, isOffsetRelative,
7806             that = $(
this ).resizable( "instance" ),
7807             o = that.options,
7808             co = that.containerOffset,
7809             cp = that.position,
7810             pRatio = that._aspectRatio ||
event.shiftKey,
7811             cop = {
7812                 top:
0,
7813                 left:
0
7814             },
7815             ce = that.containerElement,
7816             continueResize =
true;
7817
7818         
if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
7819             cop = co;
7820         }
7821
7822         
if ( cp.left < ( that._helper ? co.left : 0 ) ) {
7823             that.size.width = that.size.width +
7824                 ( that._helper ?
7825                     ( that.position.left - co.left ) :
7826                     ( that.position.left - cop.left ) );
7827
7828             
if ( pRatio ) {
7829                 that.size.height = that.size.width / that.aspectRatio;
7830                 continueResize =
false;
7831             }
7832             that.position.left = o.helper ? co.left :
0;
7833         }
7834
7835         
if ( cp.top < ( that._helper ? co.top : 0 ) ) {
7836             that.size.height = that.size.height +
7837                 ( that._helper ?
7838                     ( that.position.top - co.top ) :
7839                     that.position.top );
7840
7841             
if ( pRatio ) {
7842                 that.size.width = that.size.height * that.aspectRatio;
7843                 continueResize =
false;
7844             }
7845             that.position.top = that._helper ? co.top :
0;
7846         }
7847
7848         isParent = that.containerElement.
get( 0 ) === that.element.parent().get( 0 );
7849         isOffsetRelative = /relative|absolute/.test( that.containerElement.css(
"position" ) );
7850
7851         
if ( isParent && isOffsetRelative ) {
7852             that.offset.left = that.parentData.left + that.position.left;
7853             that.offset.top = that.parentData.top + that.position.top;
7854         }
else {
7855             that.offset.left = that.element.offset().left;
7856             that.offset.top = that.element.offset().top;
7857         }
7858
7859         woset = Math.abs( that.sizeDiff.width +
7860             (that._helper ?
7861                 that.offset.left - cop.left :
7862                 (that.offset.left - co.left)) );
7863
7864         hoset = Math.abs( that.sizeDiff.height +
7865             (that._helper ?
7866                 that.offset.top - cop.top :
7867                 (that.offset.top - co.top)) );
7868
7869         
if ( woset + that.size.width >= that.parentData.width ) {
7870             that.size.width = that.parentData.width - woset;
7871             
if ( pRatio ) {
7872                 that.size.height = that.size.width / that.aspectRatio;
7873                 continueResize =
false;
7874             }
7875         }
7876
7877         
if ( hoset + that.size.height >= that.parentData.height ) {
7878             that.size.height = that.parentData.height - hoset;
7879             
if ( pRatio ) {
7880                 that.size.width = that.size.height * that.aspectRatio;
7881                 continueResize =
false;
7882             }
7883         }
7884
7885         
if ( !continueResize ) {
7886             that.position.left = that.prevPosition.left;
7887             that.position.top = that.prevPosition.top;
7888             that.size.width = that.prevSize.width;
7889             that.size.height = that.prevSize.height;
7890         }
7891     },
7892
7893     stop: function() {
7894         
var that = $( this ).resizable( "instance" ),
7895             o = that.options,
7896             co = that.containerOffset,
7897             cop = that.containerPosition,
7898             ce = that.containerElement,
7899             helper = $( that.helper ),
7900             ho = helper.offset(),
7901             w = helper.outerWidth() - that.sizeDiff.width,
7902             h = helper.outerHeight() - that.sizeDiff.height;
7903
7904         
if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
7905             $(
this ).css({
7906                 left: ho.left - cop.left - co.left,
7907                 width: w,
7908                 height: h
7909             });
7910         }
7911
7912         
if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
7913             $(
this ).css({
7914                 left: ho.left - cop.left - co.left,
7915                 width: w,
7916                 height: h
7917             });
7918         }
7919     }
7920 });
7921
7922 $.ui.plugin.
add("resizable", "alsoResize", {
7923
7924     start: function() {
7925         
var that = $(this).resizable( "instance" ),
7926             o = that.options;
7927
7928         $(o.alsoResize).each(function() {
7929             
var el = $(this);
7930             el.data(
"ui-resizable-alsoresize", {
7931                 width: parseInt(el.width(),
10), height: parseInt(el.height(), 10),
7932                 left: parseInt(el.css(
"left"), 10), top: parseInt(el.css("top"), 10)
7933             });
7934         });
7935     },
7936
7937     resize: function(
event, ui) {
7938         
var that = $(this).resizable( "instance" ),
7939             o = that.options,
7940             os = that.originalSize,
7941             op = that.originalPosition,
7942             delta = {
7943                 height: (that.size.height - os.height) ||
0,
7944                 width: (that.size.width - os.width) ||
0,
7945                 top: (that.position.top - op.top) ||
0,
7946                 left: (that.position.left - op.left) ||
0
7947             };
7948
7949             $(o.alsoResize).each(function() {
7950                 
var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
7951                     css = el.parents(ui.originalElement[
0]).length ?
7952                             [
"width", "height" ] :
7953                             [
"width", "height", "top", "left" ];
7954
7955                 $.each(css, function(i, prop) {
7956                     
var sum = (start[prop] || 0) + (delta[prop] || 0);
7957                     
if (sum && sum >= 0) {
7958                         style[prop] = sum ||
null;
7959                     }
7960                 });
7961
7962                 el.css(style);
7963             });
7964     },
7965
7966     stop: function() {
7967         $(
this).removeData("resizable-alsoresize");
7968     }
7969 });
7970
7971 $.ui.plugin.
add("resizable", "ghost", {
7972
7973     start: function() {
7974
7975         
var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
7976
7977         that.ghost = that.originalElement.clone();
7978         that.ghost
7979             .css({
7980                 opacity:
0.25,
7981                 display:
"block",
7982                 position:
"relative",
7983                 height: cs.height,
7984                 width: cs.width,
7985                 margin:
0,
7986                 left:
0,
7987                 top:
0
7988             })
7989             .addClass(
"ui-resizable-ghost")
7990             .addClass(
typeof o.ghost === "string" ? o.ghost : "");
7991
7992         that.ghost.appendTo(that.helper);
7993
7994     },
7995
7996     resize: function() {
7997         
var that = $(this).resizable( "instance" );
7998         
if (that.ghost) {
7999             that.ghost.css({
8000                 position:
"relative",
8001                 height: that.size.height,
8002                 width: that.size.width
8003             });
8004         }
8005     },
8006
8007     stop: function() {
8008         
var that = $(this).resizable( "instance" );
8009         
if (that.ghost && that.helper) {
8010             that.helper.
get(0).removeChild(that.ghost.get(0));
8011         }
8012     }
8013
8014 });
8015
8016 $.ui.plugin.
add("resizable", "grid", {
8017
8018     resize: function() {
8019         
var outerDimensions,
8020             that = $(
this).resizable( "instance" ),
8021             o = that.options,
8022             cs = that.size,
8023             os = that.originalSize,
8024             op = that.originalPosition,
8025             a = that.axis,
8026             grid =
typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
8027             gridX = (grid[
0] || 1),
8028             gridY = (grid[
1] || 1),
8029             ox = Math.round((cs.width - os.width) / gridX) * gridX,
8030             oy = Math.round((cs.height - os.height) / gridY) * gridY,
8031             newWidth = os.width + ox,
8032             newHeight = os.height + oy,
8033             isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
8034             isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
8035             isMinWidth = o.minWidth && (o.minWidth > newWidth),
8036             isMinHeight = o.minHeight && (o.minHeight > newHeight);
8037
8038         o.grid = grid;
8039
8040         
if (isMinWidth) {
8041             newWidth += gridX;
8042         }
8043         
if (isMinHeight) {
8044             newHeight += gridY;
8045         }
8046         
if (isMaxWidth) {
8047             newWidth -= gridX;
8048         }
8049         
if (isMaxHeight) {
8050             newHeight -= gridY;
8051         }
8052
8053         
if (/^(se|s|e)$/.test(a)) {
8054             that.size.width = newWidth;
8055             that.size.height = newHeight;
8056         }
else if (/^(ne)$/.test(a)) {
8057             that.size.width = newWidth;
8058             that.size.height = newHeight;
8059             that.position.top = op.top - oy;
8060         }
else if (/^(sw)$/.test(a)) {
8061             that.size.width = newWidth;
8062             that.size.height = newHeight;
8063             that.position.left = op.left - ox;
8064         }
else {
8065             
if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
8066                 outerDimensions = that._getPaddingPlusBorderDimensions(
this );
8067             }
8068
8069             
if ( newHeight - gridY > 0 ) {
8070                 that.size.height = newHeight;
8071                 that.position.top = op.top - oy;
8072             }
else {
8073                 newHeight = gridY - outerDimensions.height;
8074                 that.size.height = newHeight;
8075                 that.position.top = op.top + os.height - newHeight;
8076             }
8077             
if ( newWidth - gridX > 0 ) {
8078                 that.size.width = newWidth;
8079                 that.position.left = op.left - ox;
8080             }
else {
8081                 newWidth = gridX - outerDimensions.width;
8082                 that.size.width = newWidth;
8083                 that.position.left = op.left + os.width - newWidth;
8084             }
8085         }
8086     }
8087
8088 });

8089
8090 var
resizable = $.ui.resizable;
8091
8092
8093 /*!
8094  * jQuery UI Dialog
1.11.4
8095  * http://jqueryui.com
8096  *
8097  * Copyright jQuery Foundation and other contributors
8098  * Released under the MIT license.
8099  * http://jquery.org/license
8100  *
8101  * http://api.jqueryui.com/dialog/
8102  */

8103
8104
8105 var
dialog = $.widget( "ui.dialog", {
8106     version:
"1.11.4",
8107     options: {
8108         appendTo:
"body",
8109         autoOpen:
true,
8110         buttons: [],
8111         closeOnEscape:
true,
8112         closeText:
"Close",
8113         dialogClass:
"",
8114         draggable:
true,
8115         hide:
null,
8116         height:
"auto",
8117         maxHeight:
null,
8118         maxWidth:
null,
8119         minHeight:
150,
8120         minWidth:
150,
8121         modal:
false,
8122         position: {
8123             my:
"center",
8124             at:
"center",
8125             of: window,
8126             collision:
"fit",
8127             
// Ensure the titlebar is always visible
8128             
using: function( pos ) {
8129                 
var topOffset = $( this ).css( pos ).offset().top;
8130                 
if ( topOffset < 0 ) {
8131                     $(
this ).css( "top", pos.top - topOffset );
8132                 }
8133             }
8134         },
8135         resizable:
true,
8136         show:
null,
8137         title:
null,
8138         width:
300,
8139
8140         
// callbacks
8141         beforeClose:
null,
8142         close:
null,
8143         drag:
null,
8144         dragStart:
null,
8145         dragStop:
null,
8146         focus:
null,
8147         open:
null,
8148         resize:
null,
8149         resizeStart:
null,
8150         resizeStop:
null
8151     },
8152
8153     sizeRelatedOptions: {
8154         buttons:
true,
8155         height:
true,
8156         maxHeight:
true,
8157         maxWidth:
true,
8158         minHeight:
true,
8159         minWidth:
true,
8160         width:
true
8161     },
8162
8163     resizableRelatedOptions: {
8164         maxHeight:
true,
8165         maxWidth:
true,
8166         minHeight:
true,
8167         minWidth:
true
8168     },
8169
8170     _create: function() {
8171         
this.originalCss = {
8172             display:
this.element[ 0 ].style.display,
8173             width:
this.element[ 0 ].style.width,
8174             minHeight:
this.element[ 0 ].style.minHeight,
8175             maxHeight:
this.element[ 0 ].style.maxHeight,
8176             height:
this.element[ 0 ].style.height
8177         };
8178         
this.originalPosition = {
8179             parent:
this.element.parent(),
8180             index:
this.element.parent().children().index( this.element )
8181         };
8182         
this.originalTitle = this.element.attr( "title" );
8183         
this.options.title = this.options.title || this.originalTitle;
8184
8185         
this._createWrapper();
8186
8187         
this.element
8188             .show()
8189             .removeAttr(
"title" )
8190             .addClass(
"ui-dialog-content ui-widget-content" )
8191             .appendTo(
this.uiDialog );
8192
8193         
this._createTitlebar();
8194         
this._createButtonPane();
8195
8196         
if ( this.options.draggable && $.fn.draggable ) {
8197             
this._makeDraggable();
8198         }
8199         
if ( this.options.resizable && $.fn.resizable ) {
8200             
this._makeResizable();
8201         }
8202
8203         
this._isOpen = false;
8204
8205         
this._trackFocus();
8206     },
8207
8208     _init: function() {
8209         
if ( this.options.autoOpen ) {
8210             
this.open();
8211         }
8212     },
8213
8214     _appendTo: function() {
8215         
var element = this.options.appendTo;
8216         
if ( element && (element.jquery || element.nodeType) ) {
8217             
return $( element );
8218         }
8219         
return this.document.find( element || "body" ).eq( 0 );
8220     },
8221
8222     _destroy: function() {
8223         
var next,
8224             originalPosition =
this.originalPosition;
8225
8226         
this._untrackInstance();
8227         
this._destroyOverlay();
8228
8229         
this.element
8230             .removeUniqueId()
8231             .removeClass(
"ui-dialog-content ui-widget-content" )
8232             .css(
this.originalCss )
8233             
// Without detaching first, the following becomes really slow
8234             .detach();
8235
8236         
this.uiDialog.stop( true, true ).remove();
8237
8238         
if ( this.originalTitle ) {
8239             
this.element.attr( "title", this.originalTitle );
8240         }
8241
8242         next = originalPosition.parent.children().eq( originalPosition.index );
8243         
// Don't try to place the dialog next to itself (#8613)
8244         
if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
8245             next.before(
this.element );
8246         }
else {
8247             originalPosition.parent.append(
this.element );
8248         }
8249     },
8250
8251     widget: function() {
8252         
return this.uiDialog;
8253     },
8254
8255     disable: $.noop,
8256     enable: $.noop,
8257
8258     close: function(
event ) {
8259         
var activeElement,
8260             that =
this;
8261
8262         
if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
8263             
return;
8264         }
8265
8266         
this._isOpen = false;
8267         
this._focusedElement = null;
8268         
this._destroyOverlay();
8269         
this._untrackInstance();
8270
8271         
if ( !this.opener.filter( ":focusable" ).focus().length ) {
8272
8273             
// support: IE9
8274             
// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
8275             
try {
8276                 activeElement =
this.document[ 0 ].activeElement;
8277
8278                 
// Support: IE9, IE10
8279                 
// If the <body> is blurred, IE will switch windows, see #4520
8280                 
if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
8281
8282                     
// Hiding a focused element doesn't trigger blur in WebKit
8283                     
// so in case we have nothing to focus on, explicitly blur the active element
8284                     
// https://bugs.webkit.org/show_bug.cgi?id=47182
8285                     $( activeElement ).blur();
8286                 }
8287             }
catch ( error ) {}
8288         }
8289
8290         
this._hide( this.uiDialog, this.options.hide, function() {
8291             that._trigger(
"close", event );
8292         });
8293     },
8294
8295     isOpen: function() {
8296         
return this._isOpen;
8297     },
8298
8299     moveToTop: function() {
8300         
this._moveToTop();
8301     },
8302
8303     _moveToTop: function(
event, silent ) {
8304         
var moved = false,
8305             zIndices =
this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
8306                 
return +$( this ).css( "z-index" );
8307             }).
get(),
8308             zIndexMax = Math.max.apply(
null, zIndices );
8309
8310         
if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
8311             
this.uiDialog.css( "z-index", zIndexMax + 1 );
8312             moved =
true;
8313         }
8314
8315         
if ( moved && !silent ) {
8316             
this._trigger( "focus", event );
8317         }
8318         
return moved;
8319     },
8320
8321     open: function() {
8322         
var that = this;
8323         
if ( this._isOpen ) {
8324             
if ( this._moveToTop() ) {
8325                 
this._focusTabbable();
8326             }
8327             
return;
8328         }
8329
8330         
this._isOpen = true;
8331         
this.opener = $( this.document[ 0 ].activeElement );
8332
8333         
this._size();
8334         
this._position();
8335         
this._createOverlay();
8336         
this._moveToTop( null, true );
8337
8338         
// Ensure the overlay is moved to the top with the dialog, but only when
8339         
// opening. The overlay shouldn't move after the dialog is open so that
8340         
// modeless dialogs opened after the modal dialog stack properly.
8341         
if ( this.overlay ) {
8342             
this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
8343         }
8344
8345         
this._show( this.uiDialog, this.options.show, function() {
8346             that._focusTabbable();
8347             that._trigger(
"focus" );
8348         });
8349
8350         
// Track the dialog immediately upon openening in case a focus event
8351         
// somehow occurs outside of the dialog before an element inside the
8352         
// dialog is focused (#10152)
8353         
this._makeFocusTarget();
8354
8355         
this._trigger( "open" );
8356     },
8357
8358     _focusTabbable: function() {
8359         
// Set focus to the first match:
8360         
// 1. An element that was focused previously
8361         
// 2. First element inside the dialog matching [autofocus]
8362         
// 3. Tabbable element inside the content element
8363         
// 4. Tabbable element inside the buttonpane
8364         
// 5. The close button
8365         
// 6. The dialog itself
8366         
var hasFocus = this._focusedElement;
8367         
if ( !hasFocus ) {
8368             hasFocus =
this.element.find( "[autofocus]" );
8369         }
8370         
if ( !hasFocus.length ) {
8371             hasFocus =
this.element.find( ":tabbable" );
8372         }
8373         
if ( !hasFocus.length ) {
8374             hasFocus =
this.uiDialogButtonPane.find( ":tabbable" );
8375         }
8376         
if ( !hasFocus.length ) {
8377             hasFocus =
this.uiDialogTitlebarClose.filter( ":tabbable" );
8378         }
8379         
if ( !hasFocus.length ) {
8380             hasFocus =
this.uiDialog;
8381         }
8382         hasFocus.eq(
0 ).focus();
8383     },
8384
8385     _keepFocus: function(
event ) {
8386         function checkFocus() {
8387             
var activeElement = this.document[0].activeElement,
8388                 isActive =
this.uiDialog[0] === activeElement ||
8389                     $.contains(
this.uiDialog[0], activeElement );
8390             
if ( !isActive ) {
8391                 
this._focusTabbable();
8392             }
8393         }
8394         
event.preventDefault();
8395         checkFocus.call(
this );
8396         
// support: IE
8397         
// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
8398         
// so we check again later
8399         
this._delay( checkFocus );
8400     },
8401
8402     _createWrapper: function() {
8403         
this.uiDialog = $("<div>")
8404             .addClass(
"ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
8405                 
this.options.dialogClass )
8406             .hide()
8407             .attr({
8408                 
// Setting tabIndex makes the div focusable
8409                 tabIndex: -
1,
8410                 role:
"dialog"
8411             })
8412             .appendTo(
this._appendTo() );
8413
8414         
this._on( this.uiDialog, {
8415             keydown: function(
event ) {
8416                 
if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
8417                         
event.keyCode === $.ui.keyCode.ESCAPE ) {
8418                     
event.preventDefault();
8419                     
this.close( event );
8420                     
return;
8421                 }
8422
8423                 
// prevent tabbing out of dialogs
8424                 
if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
8425                     
return;
8426                 }
8427                 
var tabbables = this.uiDialog.find( ":tabbable" ),
8428                     first = tabbables.filter(
":first" ),
8429                     last = tabbables.filter(
":last" );
8430
8431                 
if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
8432                     
this._delay(function() {
8433                         first.focus();
8434                     });
8435                     
event.preventDefault();
8436                 }
else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
8437                     
this._delay(function() {
8438                         last.focus();
8439                     });
8440                     
event.preventDefault();
8441                 }
8442             },
8443             mousedown: function(
event ) {
8444                 
if ( this._moveToTop( event ) ) {
8445                     
this._focusTabbable();
8446                 }
8447             }
8448         });
8449
8450         
// We assume that any existing aria-describedby attribute means
8451         
// that the dialog content is marked up properly
8452         
// otherwise we brute force the content as the description
8453         
if ( !this.element.find( "[aria-describedby]" ).length ) {
8454             
this.uiDialog.attr({
8455                 
"aria-describedby": this.element.uniqueId().attr( "id" )
8456             });
8457         }
8458     },
8459
8460     _createTitlebar: function() {
8461         
var uiDialogTitle;
8462
8463         
this.uiDialogTitlebar = $( "<div>" )
8464             .addClass(
"ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" )
8465             .prependTo(
this.uiDialog );
8466         
this._on( this.uiDialogTitlebar, {
8467             mousedown: function(
event ) {
8468                 
// Don't prevent click on close button (#8838)
8469                 
// Focusing a dialog that is partially scrolled out of view
8470                 
// causes the browser to scroll it into view, preventing the click event
8471                 
if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
8472                     
// Dialog isn't getting focus when dragging (#8063)
8473                     
this.uiDialog.focus();
8474                 }
8475             }
8476         });
8477
8478         
// support: IE
8479         
// Use type="button" to prevent enter keypresses in textboxes from closing the
8480         
// dialog in IE (#9312)
8481         
this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
8482             .button({
8483                 label:
this.options.closeText,
8484                 icons: {
8485                     primary:
"ui-icon-closethick"
8486                 },
8487                 text:
false
8488             })
8489             .addClass(
"ui-dialog-titlebar-close" )
8490             .appendTo(
this.uiDialogTitlebar );
8491         
this._on( this.uiDialogTitlebarClose, {
8492             click: function(
event ) {
8493                 
event.preventDefault();
8494                 
this.close( event );
8495             }
8496         });
8497
8498         uiDialogTitle = $(
"<span>" )
8499             .uniqueId()
8500             .addClass(
"ui-dialog-title" )
8501             .prependTo(
this.uiDialogTitlebar );
8502         
this._title( uiDialogTitle );
8503
8504         
this.uiDialog.attr({
8505             
"aria-labelledby": uiDialogTitle.attr( "id" )
8506         });
8507     },
8508
8509     _title: function( title ) {
8510         
if ( !this.options.title ) {
8511             title.html(
"&#160;" );
8512         }
8513         title.text(
this.options.title );
8514     },
8515
8516     _createButtonPane: function() {
8517         
this.uiDialogButtonPane = $( "<div>" )
8518             .addClass(
"ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
8519
8520         
this.uiButtonSet = $( "<div>" )
8521             .addClass(
"ui-dialog-buttonset" )
8522             .appendTo(
this.uiDialogButtonPane );
8523
8524         
this._createButtons();
8525     },
8526
8527     _createButtons: function() {
8528         
var that = this,
8529             buttons =
this.options.buttons;
8530
8531         
// if we already have a button pane, remove it
8532         
this.uiDialogButtonPane.remove();
8533         
this.uiButtonSet.empty();
8534
8535         
if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
8536             
this.uiDialog.removeClass( "ui-dialog-buttons" );
8537             
return;
8538         }
8539
8540         $.each( buttons, function( name, props ) {
8541             
var click, buttonOptions;
8542             props = $.isFunction( props ) ?
8543                 { click: props, text: name } :
8544                 props;
8545             
// Default to a non-submitting button
8546             props = $.extend( { type:
"button" }, props );
8547             
// Change the context for the click callback to be the main element
8548             click = props.click;
8549             props.click = function() {
8550                 click.apply( that.element[
0 ], arguments );
8551             };
8552             buttonOptions = {
8553                 icons: props.icons,
8554                 text: props.showText
8555             };
8556             delete props.icons;
8557             delete props.showText;
8558             $(
"<button></button>", props )
8559                 .button( buttonOptions )
8560                 .appendTo( that.uiButtonSet );
8561         });
8562         
this.uiDialog.addClass( "ui-dialog-buttons" );
8563         
this.uiDialogButtonPane.appendTo( this.uiDialog );
8564     },
8565
8566     _makeDraggable: function() {
8567         
var that = this,
8568             options =
this.options;
8569
8570         function filteredUi( ui ) {
8571             
return {
8572                 position: ui.position,
8573                 offset: ui.offset
8574             };
8575         }
8576
8577         
this.uiDialog.draggable({
8578             cancel:
".ui-dialog-content, .ui-dialog-titlebar-close",
8579             handle:
".ui-dialog-titlebar",
8580             containment:
"document",
8581             start: function(
event, ui ) {
8582                 $(
this ).addClass( "ui-dialog-dragging" );
8583                 that._blockFrames();
8584                 that._trigger(
"dragStart", event, filteredUi( ui ) );
8585             },
8586             drag: function(
event, ui ) {
8587                 that._trigger(
"drag", event, filteredUi( ui ) );
8588             },
8589             stop: function(
event, ui ) {
8590                 
var left = ui.offset.left - that.document.scrollLeft(),
8591                     top = ui.offset.top - that.document.scrollTop();
8592
8593                 options.position = {
8594                     my:
"left top",
8595                     at:
"left" + (left >= 0 ? "+" : "") + left + " " +
8596                         
"top" + (top >= 0 ? "+" : "") + top,
8597                     of: that.window
8598                 };
8599                 $(
this ).removeClass( "ui-dialog-dragging" );
8600                 that._unblockFrames();
8601                 that._trigger(
"dragStop", event, filteredUi( ui ) );
8602             }
8603         });
8604     },
8605
8606     _makeResizable: function() {
8607         
var that = this,
8608             options =
this.options,
8609             handles = options.resizable,
8610             
// .ui-resizable has position: relative defined in the stylesheet
8611             
// but dialogs have to use absolute or fixed positioning
8612             position =
this.uiDialog.css("position"),
8613             resizeHandles =
typeof handles === "string" ?
8614                 handles :
8615                 
"n,e,s,w,se,sw,ne,nw";
8616
8617         function filteredUi( ui ) {
8618             
return {
8619                 originalPosition: ui.originalPosition,
8620                 originalSize: ui.originalSize,
8621                 position: ui.position,
8622                 size: ui.size
8623             };
8624         }
8625
8626         
this.uiDialog.resizable({
8627             cancel:
".ui-dialog-content",
8628             containment:
"document",
8629             alsoResize:
this.element,
8630             maxWidth: options.maxWidth,
8631             maxHeight: options.maxHeight,
8632             minWidth: options.minWidth,
8633             minHeight:
this._minHeight(),
8634             handles: resizeHandles,
8635             start: function(
event, ui ) {
8636                 $(
this ).addClass( "ui-dialog-resizing" );
8637                 that._blockFrames();
8638                 that._trigger(
"resizeStart", event, filteredUi( ui ) );
8639             },
8640             resize: function(
event, ui ) {
8641                 that._trigger(
"resize", event, filteredUi( ui ) );
8642             },
8643             stop: function(
event, ui ) {
8644                 
var offset = that.uiDialog.offset(),
8645                     left = offset.left - that.document.scrollLeft(),
8646                     top = offset.top - that.document.scrollTop();
8647
8648                 options.height = that.uiDialog.height();
8649                 options.width = that.uiDialog.width();
8650                 options.position = {
8651                     my:
"left top",
8652                     at:
"left" + (left >= 0 ? "+" : "") + left + " " +
8653                         
"top" + (top >= 0 ? "+" : "") + top,
8654                     of: that.window
8655                 };
8656                 $(
this ).removeClass( "ui-dialog-resizing" );
8657                 that._unblockFrames();
8658                 that._trigger(
"resizeStop", event, filteredUi( ui ) );
8659             }
8660         })
8661         .css(
"position", position );
8662     },
8663
8664     _trackFocus: function() {
8665         
this._on( this.widget(), {
8666             focusin: function(
event ) {
8667                 
this._makeFocusTarget();
8668                 
this._focusedElement = $( event.target );
8669             }
8670         });
8671     },
8672
8673     _makeFocusTarget: function() {
8674         
this._untrackInstance();
8675         
this._trackingInstances().unshift( this );
8676     },
8677
8678     _untrackInstance: function() {
8679         
var instances = this._trackingInstances(),
8680             exists = $.inArray(
this, instances );
8681         
if ( exists !== -1 ) {
8682             instances.splice( exists,
1 );
8683         }
8684     },
8685
8686     _trackingInstances: function() {
8687         
var instances = this.document.data( "ui-dialog-instances" );
8688         
if ( !instances ) {
8689             instances = [];
8690             
this.document.data( "ui-dialog-instances", instances );
8691         }
8692         
return instances;
8693     },
8694
8695     _minHeight: function() {
8696         
var options = this.options;
8697
8698         
return options.height === "auto" ?
8699             options.minHeight :
8700             Math.min( options.minHeight, options.height );
8701     },
8702
8703     _position: function() {
8704         
// Need to show the dialog to get the actual offset in the position plugin
8705         
var isVisible = this.uiDialog.is( ":visible" );
8706         
if ( !isVisible ) {
8707             
this.uiDialog.show();
8708         }
8709         
this.uiDialog.position( this.options.position );
8710         
if ( !isVisible ) {
8711             
this.uiDialog.hide();
8712         }
8713     },
8714
8715     _setOptions: function( options ) {
8716         
var that = this,
8717             resize =
false,
8718             resizableOptions = {};
8719
8720         $.each( options, function( key,
value ) {
8721             that._setOption( key,
value );
8722
8723             
if ( key in that.sizeRelatedOptions ) {
8724                 resize =
true;
8725             }
8726             
if ( key in that.resizableRelatedOptions ) {
8727                 resizableOptions[ key ] =
value;
8728             }
8729         });
8730
8731         
if ( resize ) {
8732             
this._size();
8733             
this._position();
8734         }
8735         
if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
8736             
this.uiDialog.resizable( "option", resizableOptions );
8737         }
8738     },
8739
8740     _setOption: function( key,
value ) {
8741         
var isDraggable, isResizable,
8742             uiDialog =
this.uiDialog;
8743
8744         
if ( key === "dialogClass" ) {
8745             uiDialog
8746                 .removeClass(
this.options.dialogClass )
8747                 .addClass(
value );
8748         }
8749
8750         
if ( key === "disabled" ) {
8751             
return;
8752         }
8753
8754         
this._super( key, value );
8755
8756         
if ( key === "appendTo" ) {
8757             
this.uiDialog.appendTo( this._appendTo() );
8758         }
8759
8760         
if ( key === "buttons" ) {
8761             
this._createButtons();
8762         }
8763
8764         
if ( key === "closeText" ) {
8765             
this.uiDialogTitlebarClose.button({
8766                 
// Ensure that we always pass a string
8767                 label:
"" + value
8768             });
8769         }
8770
8771         
if ( key === "draggable" ) {
8772             isDraggable = uiDialog.
is( ":data(ui-draggable)" );
8773             
if ( isDraggable && !value ) {
8774                 uiDialog.draggable(
"destroy" );
8775             }
8776
8777             
if ( !isDraggable && value ) {
8778                 
this._makeDraggable();
8779             }
8780         }
8781
8782         
if ( key === "position" ) {
8783             
this._position();
8784         }
8785
8786         
if ( key === "resizable" ) {
8787             
// currently resizable, becoming non-resizable
8788             isResizable = uiDialog.
is( ":data(ui-resizable)" );
8789             
if ( isResizable && !value ) {
8790                 uiDialog.resizable(
"destroy" );
8791             }
8792
8793             
// currently resizable, changing handles
8794             
if ( isResizable && typeof value === "string" ) {
8795                 uiDialog.resizable(
"option", "handles", value );
8796             }
8797
8798             
// currently non-resizable, becoming resizable
8799             
if ( !isResizable && value !== false ) {
8800                 
this._makeResizable();
8801             }
8802         }
8803
8804         
if ( key === "title" ) {
8805             
this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
8806         }
8807     },
8808
8809     _size: function() {
8810         
// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
8811         
// divs will both have width and height set, so we need to reset them
8812         
var nonContentHeight, minContentHeight, maxContentHeight,
8813             options =
this.options;
8814
8815         
// Reset content sizing
8816         
this.element.show().css({
8817             width:
"auto",
8818             minHeight:
0,
8819             maxHeight:
"none",
8820             height:
0
8821         });
8822
8823         
if ( options.minWidth > options.width ) {
8824             options.width = options.minWidth;
8825         }
8826
8827         
// reset wrapper sizing
8828         
// determine the height of all the non-content elements
8829         nonContentHeight =
this.uiDialog.css({
8830                 height:
"auto",
8831                 width: options.width
8832             })
8833             .outerHeight();
8834         minContentHeight = Math.max(
0, options.minHeight - nonContentHeight );
8835         maxContentHeight =
typeof options.maxHeight === "number" ?
8836             Math.max(
0, options.maxHeight - nonContentHeight ) :
8837             
"none";
8838
8839         
if ( options.height === "auto" ) {
8840             
this.element.css({
8841                 minHeight: minContentHeight,
8842                 maxHeight: maxContentHeight,
8843                 height:
"auto"
8844             });
8845         }
else {
8846             
this.element.height( Math.max( 0, options.height - nonContentHeight ) );
8847         }
8848
8849         
if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
8850             
this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
8851         }
8852     },
8853
8854     _blockFrames: function() {
8855         
this.iframeBlocks = this.document.find( "iframe" ).map(function() {
8856             
var iframe = $( this );
8857
8858             
return $( "<div>" )
8859                 .css({
8860                     position:
"absolute",
8861                     width: iframe.outerWidth(),
8862                     height: iframe.outerHeight()
8863                 })
8864                 .appendTo( iframe.parent() )
8865                 .offset( iframe.offset() )[
0];
8866         });
8867     },
8868
8869     _unblockFrames: function() {
8870         
if ( this.iframeBlocks ) {
8871             
this.iframeBlocks.remove();
8872             delete
this.iframeBlocks;
8873         }
8874     },
8875
8876     _allowInteraction: function(
event ) {
8877         
if ( $( event.target ).closest( ".ui-dialog" ).length ) {
8878             
return true;
8879         }
8880
8881         
// TODO: Remove hack when datepicker implements
8882         
// the .ui-front logic (#8989)
8883         
return !!$( event.target ).closest( ".ui-datepicker" ).length;
8884     },
8885
8886     _createOverlay: function() {
8887         
if ( !this.options.modal ) {
8888             
return;
8889         }
8890
8891         
// We use a delay in case the overlay is created from an
8892         
// event that we're going to be cancelling (#2804)
8893         
var isOpening = true;
8894         
this._delay(function() {
8895             isOpening =
false;
8896         });
8897
8898         
if ( !this.document.data( "ui-dialog-overlays" ) ) {
8899
8900             
// Prevent use of anchors and inputs
8901             
// Using _on() for an event handler shared across many instances is
8902             
// safe because the dialogs stack and must be closed in reverse order
8903             
this._on( this.document, {
8904                 focusin: function(
event ) {
8905                     
if ( isOpening ) {
8906                         
return;
8907                     }
8908
8909                     
if ( !this._allowInteraction( event ) ) {
8910                         
event.preventDefault();
8911                         
this._trackingInstances()[ 0 ]._focusTabbable();
8912                     }
8913                 }
8914             });
8915         }
8916
8917         
this.overlay = $( "<div>" )
8918             .addClass(
"ui-widget-overlay ui-front" )
8919             .appendTo(
this._appendTo() );
8920         
this._on( this.overlay, {
8921             mousedown:
"_keepFocus"
8922         });
8923         
this.document.data( "ui-dialog-overlays",
8924             (
this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
8925     },
8926
8927     _destroyOverlay: function() {
8928         
if ( !this.options.modal ) {
8929             
return;
8930         }
8931
8932         
if ( this.overlay ) {
8933             
var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
8934
8935             
if ( !overlays ) {
8936                 
this.document
8937                     .unbind(
"focusin" )
8938                     .removeData(
"ui-dialog-overlays" );
8939             }
else {
8940                 
this.document.data( "ui-dialog-overlays", overlays );
8941             }
8942
8943             
this.overlay.remove();
8944             
this.overlay = null;
8945         }
8946     }
8947 });

8948
8949
8950 /*!
8951  * jQuery UI Droppable
1.11.4
8952  * http://jqueryui.com
8953  *
8954  * Copyright jQuery Foundation and other contributors
8955  * Released under the MIT license.
8956  * http://jquery.org/license
8957  *
8958  * http://api.jqueryui.com/droppable/
8959  */

8960
8961
8962 $.widget(
"ui.droppable", {
8963     version:
"1.11.4",
8964     widgetEventPrefix:
"drop",
8965     options: {
8966         accept:
"*",
8967         activeClass:
false,
8968         addClasses:
true,
8969         greedy:
false,
8970         hoverClass:
false,
8971         scope:
"default",
8972         tolerance:
"intersect",
8973
8974         
// callbacks
8975         activate:
null,
8976         deactivate:
null,
8977         drop:
null,
8978         
out: null,
8979         over:
null
8980     },
8981     _create: function() {
8982
8983         
var proportions,
8984             o =
this.options,
8985             accept = o.accept;
8986
8987         
this.isover = false;
8988         
this.isout = true;
8989
8990         
this.accept = $.isFunction( accept ) ? accept : function( d ) {
8991             
return d.is( accept );
8992         };
8993
8994         
this.proportions = function( /* valueToWrite */ ) {
8995             
if ( arguments.length ) {
8996                 
// Store the droppable's proportions
8997                 proportions = arguments[
0 ];
8998             }
else {
8999                 
// Retrieve or derive the droppable's proportions
9000                 
return proportions ?
9001                     proportions :
9002                     proportions = {
9003                         width:
this.element[ 0 ].offsetWidth,
9004                         height:
this.element[ 0 ].offsetHeight
9005                     };
9006             }
9007         };
9008
9009         
this._addToManager( o.scope );
9010
9011         o.addClasses &&
this.element.addClass( "ui-droppable" );
9012
9013     },
9014
9015     _addToManager: function( scope ) {
9016         
// Add the reference and positions to the manager
9017         $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
9018         $.ui.ddmanager.droppables[ scope ].push(
this );
9019     },
9020
9021     _splice: function( drop ) {
9022         
var i = 0;
9023         
for ( ; i < drop.length; i++ ) {
9024             
if ( drop[ i ] === this ) {
9025                 drop.splice( i,
1 );
9026             }
9027         }
9028     },
9029
9030     _destroy: function() {
9031         
var drop = $.ui.ddmanager.droppables[ this.options.scope ];
9032
9033         
this._splice( drop );
9034
9035         
this.element.removeClass( "ui-droppable ui-droppable-disabled" );
9036     },
9037
9038     _setOption: function( key,
value ) {
9039
9040         
if ( key === "accept" ) {
9041             
this.accept = $.isFunction( value ) ? value : function( d ) {
9042                 
return d.is( value );
9043             };
9044         }
else if ( key === "scope" ) {
9045             
var drop = $.ui.ddmanager.droppables[ this.options.scope ];
9046
9047             
this._splice( drop );
9048             
this._addToManager( value );
9049         }
9050
9051         
this._super( key, value );
9052     },
9053
9054     _activate: function(
event ) {
9055         
var draggable = $.ui.ddmanager.current;
9056         
if ( this.options.activeClass ) {
9057             
this.element.addClass( this.options.activeClass );
9058         }
9059         
if ( draggable ){
9060             
this._trigger( "activate", event, this.ui( draggable ) );
9061         }
9062     },
9063
9064     _deactivate: function(
event ) {
9065         
var draggable = $.ui.ddmanager.current;
9066         
if ( this.options.activeClass ) {
9067             
this.element.removeClass( this.options.activeClass );
9068         }
9069         
if ( draggable ){
9070             
this._trigger( "deactivate", event, this.ui( draggable ) );
9071         }
9072     },
9073
9074     _over: function(
event ) {
9075
9076         
var draggable = $.ui.ddmanager.current;
9077
9078         
// Bail if draggable and droppable are same element
9079         
if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
9080             
return;
9081         }
9082
9083         
if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9084             
if ( this.options.hoverClass ) {
9085                 
this.element.addClass( this.options.hoverClass );
9086             }
9087             
this._trigger( "over", event, this.ui( draggable ) );
9088         }
9089
9090     },
9091
9092     _out: function(
event ) {
9093
9094         
var draggable = $.ui.ddmanager.current;
9095
9096         
// Bail if draggable and droppable are same element
9097         
if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
9098             
return;
9099         }
9100
9101         
if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9102             
if ( this.options.hoverClass ) {
9103                 
this.element.removeClass( this.options.hoverClass );
9104             }
9105             
this._trigger( "out", event, this.ui( draggable ) );
9106         }
9107
9108     },
9109
9110     _drop: function(
event, custom ) {
9111
9112         
var draggable = custom || $.ui.ddmanager.current,
9113             childrenIntersection =
false;
9114
9115         
// Bail if draggable and droppable are same element
9116         
if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
9117             
return false;
9118         }
9119
9120         
this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
9121             
var inst = $( this ).droppable( "instance" );
9122             
if (
9123                 inst.options.greedy &&
9124                 !inst.options.disabled &&
9125                 inst.options.scope === draggable.options.scope &&
9126                 inst.accept.call( inst.element[
0 ], ( draggable.currentItem || draggable.element ) ) &&
9127                 $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance,
event )
9128             ) { childrenIntersection =
true; return false; }
9129         });
9130         
if ( childrenIntersection ) {
9131             
return false;
9132         }
9133
9134         
if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9135             
if ( this.options.activeClass ) {
9136                 
this.element.removeClass( this.options.activeClass );
9137             }
9138             
if ( this.options.hoverClass ) {
9139                 
this.element.removeClass( this.options.hoverClass );
9140             }
9141             
this._trigger( "drop", event, this.ui( draggable ) );
9142             
return this.element;
9143         }
9144
9145         
return false;
9146
9147     },
9148
9149     ui: function( c ) {
9150         
return {
9151             draggable: ( c.currentItem || c.element ),
9152             helper: c.helper,
9153             position: c.position,
9154             offset: c.positionAbs
9155         };
9156     }
9157
9158 });
9159
9160 $.ui.intersect = (function() {
9161     function isOverAxis( x, reference, size ) {
9162         
return ( x >= reference ) && ( x < ( reference + size ) );
9163     }
9164
9165     
return function( draggable, droppable, toleranceMode, event ) {
9166
9167         
if ( !droppable.offset ) {
9168             
return false;
9169         }
9170
9171         
var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
9172             y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
9173             x2 = x1 + draggable.helperProportions.width,
9174             y2 = y1 + draggable.helperProportions.height,
9175             l = droppable.offset.left,
9176             t = droppable.offset.top,
9177             r = l + droppable.proportions().width,
9178             b = t + droppable.proportions().height;
9179
9180         
switch ( toleranceMode ) {
9181         
case "fit":
9182             
return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
9183         
case "intersect":
9184             
return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
9185                 x2 - ( draggable.helperProportions.width /
2 ) < r && // Left Half
9186                 t < y1 + ( draggable.helperProportions.height /
2 ) && // Bottom Half
9187                 y2 - ( draggable.helperProportions.height /
2 ) < b ); // Top Half
9188         
case "pointer":
9189             
return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
9190         
case "touch":
9191             
return (
9192                 ( y1 >= t && y1 <= b ) ||
// Top edge touching
9193                 ( y2 >= t && y2 <= b ) ||
// Bottom edge touching
9194                 ( y1 < t && y2 > b )
// Surrounded vertically
9195             ) && (
9196                 ( x1 >= l && x1 <= r ) ||
// Left edge touching
9197                 ( x2 >= l && x2 <= r ) ||
// Right edge touching
9198                 ( x1 < l && x2 > r )
// Surrounded horizontally
9199             );
9200         
default:
9201             
return false;
9202         }
9203     };
9204 })();

9205
9206 /*
9207     This manager tracks offsets of draggables and droppables
9208 */

9209 $.ui.ddmanager = {
9210     current:
null,
9211     droppables: {
"default": [] },
9212     prepareOffsets: function( t,
event ) {
9213
9214         
var i, j,
9215             m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
9216             type =
event ? event.type : null, // workaround for #2317
9217             list = ( t.currentItem || t.element ).find(
":data(ui-droppable)" ).addBack();
9218
9219         droppablesLoop:
for ( i = 0; i < m.length; i++ ) {
9220
9221             
// No disabled and non-accepted
9222             
if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
9223                 
continue;
9224             }
9225
9226             
// Filter out elements in the current dragged item
9227             
for ( j = 0; j < list.length; j++ ) {
9228                 
if ( list[ j ] === m[ i ].element[ 0 ] ) {
9229                     m[ i ].proportions().height =
0;
9230                     
continue droppablesLoop;
9231                 }
9232             }
9233
9234             m[ i ].visible = m[ i ].element.css(
"display" ) !== "none";
9235             
if ( !m[ i ].visible ) {
9236                 
continue;
9237             }
9238
9239             
// Activate the droppable if used directly from draggables
9240             
if ( type === "mousedown" ) {
9241                 m[ i ]._activate.call( m[ i ],
event );
9242             }
9243
9244             m[ i ].offset = m[ i ].element.offset();
9245             m[ i ].proportions({ width: m[ i ].element[
0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
9246
9247         }
9248
9249     },
9250     drop: function( draggable,
event ) {
9251
9252         
var dropped = false;
9253         
// Create a copy of the droppables in case the list changes during the drop (#9116)
9254         $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
9255
9256             
if ( !this.options ) {
9257                 
return;
9258             }
9259             
if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
9260                 dropped =
this._drop.call( this, event ) || dropped;
9261             }
9262
9263             
if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9264                 
this.isout = true;
9265                 
this.isover = false;
9266                 
this._deactivate.call( this, event );
9267             }
9268
9269         });
9270         
return dropped;
9271
9272     },
9273     dragStart: function( draggable,
event ) {
9274         
// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
9275         draggable.element.parentsUntil(
"body" ).bind( "scroll.droppable", function() {
9276             
if ( !draggable.options.refreshPositions ) {
9277                 $.ui.ddmanager.prepareOffsets( draggable,
event );
9278             }
9279         });
9280     },
9281     drag: function( draggable,
event ) {
9282
9283         
// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
9284         
if ( draggable.options.refreshPositions ) {
9285             $.ui.ddmanager.prepareOffsets( draggable,
event );
9286         }
9287
9288         
// Run through all droppables and check their positions based on specific tolerance options
9289         $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
9290
9291             
if ( this.options.disabled || this.greedyChild || !this.visible ) {
9292                 
return;
9293             }
9294
9295             
var parentInstance, scope, parent,
9296                 intersects = $.ui.intersect( draggable,
this, this.options.tolerance, event ),
9297                 c = !intersects &&
this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
9298             
if ( !c ) {
9299                 
return;
9300             }
9301
9302             
if ( this.options.greedy ) {
9303                 
// find droppable parents with same scope
9304                 scope =
this.options.scope;
9305                 parent =
this.element.parents( ":data(ui-droppable)" ).filter(function() {
9306                     
return $( this ).droppable( "instance" ).options.scope === scope;
9307                 });
9308
9309                 
if ( parent.length ) {
9310                     parentInstance = $( parent[
0 ] ).droppable( "instance" );
9311                     parentInstance.greedyChild = ( c ===
"isover" );
9312                 }
9313             }
9314
9315             
// we just moved into a greedy child
9316             
if ( parentInstance && c === "isover" ) {
9317                 parentInstance.isover =
false;
9318                 parentInstance.isout =
true;
9319                 parentInstance._out.call( parentInstance,
event );
9320             }
9321
9322             
this[ c ] = true;
9323             
this[c === "isout" ? "isover" : "isout"] = false;
9324             
this[c === "isover" ? "_over" : "_out"].call( this, event );
9325
9326             
// we just moved out of a greedy child
9327             
if ( parentInstance && c === "isout" ) {
9328                 parentInstance.isout =
false;
9329                 parentInstance.isover =
true;
9330                 parentInstance._over.call( parentInstance,
event );
9331             }
9332         });
9333
9334     },
9335     dragStop: function( draggable,
event ) {
9336         draggable.element.parentsUntil(
"body" ).unbind( "scroll.droppable" );
9337         
// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
9338         
if ( !draggable.options.refreshPositions ) {
9339             $.ui.ddmanager.prepareOffsets( draggable,
event );
9340         }
9341     }
9342 };

9343
9344 var
droppable = $.ui.droppable;
9345
9346
9347 /*!
9348  * jQuery UI Effects
1.11.4
9349  * http://jqueryui.com
9350  *
9351  * Copyright jQuery Foundation and other contributors
9352  * Released under the MIT license.
9353  * http://jquery.org/license
9354  *
9355  * http://api.jqueryui.com/category/effects-core/
9356  */

9357
9358
9359 var
dataSpace = "ui-effects-",
9360
9361     
// Create a local jQuery because jQuery Color relies on it and the
9362     
// global may not exist with AMD and a custom build (#10199)
9363     jQuery = $;
9364
9365 $.effects = {
9366     effect: {}
9367 };

9368
9369 /*!
9370  * jQuery Color Animations v2.
1.2
9371  * https://github.com/jquery/jquery-color
9372  *
9373  * Copyright
2014 jQuery Foundation and other contributors
9374  * Released under the MIT license.
9375  * http://jquery.org/license
9376  *
9377  * Date: Wed Jan
16 08:47:09 2013 -0600
9378  */

9379 (function( jQuery, undefined ) {
9380
9381     
var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
9382
9383     
// plusequals test for += 100 -= 100
9384     rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
9385     
// a set of RE's that can match strings and generate color tuples.
9386     stringParsers = [ {
9387             re: /rgba?\(\s*(\d{
1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
9388             parse: function( execResult ) {
9389                 
return [
9390                     execResult[
1 ],
9391                     execResult[
2 ],
9392                     execResult[
3 ],
9393                     execResult[
4 ]
9394                 ];
9395             }
9396         }, {
9397             re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
9398             parse: function( execResult ) {
9399                 
return [
9400                     execResult[
1 ] * 2.55,
9401                     execResult[
2 ] * 2.55,
9402                     execResult[
3 ] * 2.55,
9403                     execResult[
4 ]
9404                 ];
9405             }
9406         }, {
9407             
// this regex ignores A-F because it's compared against an already lowercased string
9408             re: /#([a-f0-
9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
9409             parse: function( execResult ) {
9410                 
return [
9411                     parseInt( execResult[
1 ], 16 ),
9412                     parseInt( execResult[
2 ], 16 ),
9413                     parseInt( execResult[
3 ], 16 )
9414                 ];
9415             }
9416         }, {
9417             
// this regex ignores A-F because it's compared against an already lowercased string
9418             re: /#([a-f0-
9])([a-f0-9])([a-f0-9])/,
9419             parse: function( execResult ) {
9420                 
return [
9421                     parseInt( execResult[
1 ] + execResult[ 1 ], 16 ),
9422                     parseInt( execResult[
2 ] + execResult[ 2 ], 16 ),
9423                     parseInt( execResult[
3 ] + execResult[ 3 ], 16 )
9424                 ];
9425             }
9426         }, {
9427             re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
9428             space:
"hsla",
9429             parse: function( execResult ) {
9430                 
return [
9431                     execResult[
1 ],
9432                     execResult[
2 ] / 100,
9433                     execResult[
3 ] / 100,
9434                     execResult[
4 ]
9435                 ];
9436             }
9437         } ],
9438
9439     
// jQuery.Color( )
9440     color = jQuery.Color = function( color, green, blue, alpha ) {
9441         
return new jQuery.Color.fn.parse( color, green, blue, alpha );
9442     },
9443     spaces = {
9444         rgba: {
9445             props: {
9446                 red: {
9447                     idx:
0,
9448                     type:
"byte"
9449                 },
9450                 green: {
9451                     idx:
1,
9452                     type:
"byte"
9453                 },
9454                 blue: {
9455                     idx:
2,
9456                     type:
"byte"
9457                 }
9458             }
9459         },
9460
9461         hsla: {
9462             props: {
9463                 hue: {
9464                     idx:
0,
9465                     type:
"degrees"
9466                 },
9467                 saturation: {
9468                     idx:
1,
9469                     type:
"percent"
9470                 },
9471                 lightness: {
9472                     idx:
2,
9473                     type:
"percent"
9474                 }
9475             }
9476         }
9477     },
9478     propTypes = {
9479         
"byte": {
9480             floor:
true,
9481             max:
255
9482         },
9483         
"percent": {
9484             max:
1
9485         },
9486         
"degrees": {
9487             mod:
360,
9488             floor:
true
9489         }
9490     },
9491     support = color.support = {},
9492
9493     
// element for support tests
9494     supportElem = jQuery(
"<p>" )[ 0 ],
9495
9496     
// colors = jQuery.Color.names
9497     colors,
9498
9499     
// local aliases of functions called often
9500     each = jQuery.each;

9501
9502 // determine rgba support immediately

9503 supportElem.style.cssText =
"background-color:rgba(1,1,1,.5)";
9504 support.rgba = supportElem.style.backgroundColor.indexOf(
"rgba" ) > -1;
9505
9506 // define cache name and alpha properties
9507 //
for rgba and hsla spaces
9508 each( spaces, function( spaceName, space ) {
9509     space.cache =
"_" + spaceName;
9510     space.props.alpha = {
9511         idx:
3,
9512         type:
"percent",
9513         def:
1
9514     };
9515 });
9516
9517 function clamp(
value, prop, allowEmpty ) {
9518     
var type = propTypes[ prop.type ] || {};
9519
9520     
if ( value == null ) {
9521         
return (allowEmpty || !prop.def) ? null : prop.def;
9522     }
9523
9524     
// ~~ is an short way of doing floor for positive numbers
9525     
value = type.floor ? ~~value : parseFloat( value );
9526
9527     
// IE will pass in empty strings as value for alpha,
9528     
// which will hit this case
9529     
if ( isNaN( value ) ) {
9530         
return prop.def;
9531     }
9532
9533     
if ( type.mod ) {
9534         
// we add mod before modding to make sure that negatives values
9535         
// get converted properly: -10 -> 350
9536         
return (value + type.mod) % type.mod;
9537     }
9538
9539     
// for now all property types without mod have min and max
9540     
return 0 > value ? 0 : type.max < value ? type.max : value;
9541 }
9542
9543 function stringParse(
string ) {
9544     
var inst = color(),
9545         rgba = inst._rgba = [];
9546
9547     
string = string.toLowerCase();
9548
9549     each( stringParsers, function( i, parser ) {
9550         
var parsed,
9551             match = parser.re.exec(
string ),
9552             values = match && parser.parse( match ),
9553             spaceName = parser.space ||
"rgba";
9554
9555         
if ( values ) {
9556             parsed = inst[ spaceName ]( values );
9557
9558             
// if this was an rgba parse the assignment might happen twice
9559             
// oh well....
9560             inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
9561             rgba = inst._rgba = parsed._rgba;
9562
9563             
// exit each( stringParsers ) here because we matched
9564             
return false;
9565         }
9566     });
9567
9568     
// Found a stringParser that handled it
9569     
if ( rgba.length ) {
9570
9571         
// if this came from a parsed string, force "transparent" when alpha is 0
9572         
// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
9573         
if ( rgba.join() === "0,0,0,0" ) {
9574             jQuery.extend( rgba, colors.transparent );
9575         }
9576         
return inst;
9577     }
9578
9579     
// named colors
9580     
return colors[ string ];
9581 }
9582
9583 color.fn = jQuery.extend( color.prototype, {
9584     parse: function( red, green, blue, alpha ) {
9585         
if ( red === undefined ) {
9586             
this._rgba = [ null, null, null, null ];
9587             
return this;
9588         }
9589         
if ( red.jquery || red.nodeType ) {
9590             red = jQuery( red ).css( green );
9591             green = undefined;
9592         }
9593
9594         
var inst = this,
9595             type = jQuery.type( red ),
9596             rgba =
this._rgba = [];
9597
9598         
// more than 1 argument specified - assume ( red, green, blue, alpha )
9599         
if ( green !== undefined ) {
9600             red = [ red, green, blue, alpha ];
9601             type =
"array";
9602         }
9603
9604         
if ( type === "string" ) {
9605             
return this.parse( stringParse( red ) || colors._default );
9606         }
9607
9608         
if ( type === "array" ) {
9609             each( spaces.rgba.props, function( key, prop ) {
9610                 rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
9611             });
9612             
return this;
9613         }
9614
9615         
if ( type === "object" ) {
9616             
if ( red instanceof color ) {
9617                 each( spaces, function( spaceName, space ) {
9618                     
if ( red[ space.cache ] ) {
9619                         inst[ space.cache ] = red[ space.cache ].slice();
9620                     }
9621                 });
9622             }
else {
9623                 each( spaces, function( spaceName, space ) {
9624                     
var cache = space.cache;
9625                     each( space.props, function( key, prop ) {
9626
9627                         
// if the cache doesn't exist, and we know how to convert
9628                         
if ( !inst[ cache ] && space.to ) {
9629
9630                             
// if the value was null, we don't need to copy it
9631                             
// if the key was alpha, we don't need to copy it either
9632                             
if ( key === "alpha" || red[ key ] == null ) {
9633                                 
return;
9634                             }
9635                             inst[ cache ] = space.to( inst._rgba );
9636                         }
9637
9638                         
// this is the only case where we allow nulls for ALL properties.
9639                         
// call clamp with alwaysAllowEmpty
9640                         inst[ cache ][ prop.idx ] = clamp( red[ key ], prop,
true );
9641                     });
9642
9643                     
// everything defined but alpha?
9644                     
if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
9645                         
// use the default of 1
9646                         inst[ cache ][
3 ] = 1;
9647                         
if ( space.from ) {
9648                             inst._rgba = space.
from( inst[ cache ] );
9649                         }
9650                     }
9651                 });
9652             }
9653             
return this;
9654         }
9655     },
9656     
is: function( compare ) {
9657         
var is = color( compare ),
9658             same =
true,
9659             inst =
this;
9660
9661         each( spaces, function( _, space ) {
9662             
var localCache,
9663                 isCache =
is[ space.cache ];
9664             
if (isCache) {
9665                 localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
9666                 each( space.props, function( _, prop ) {
9667                     
if ( isCache[ prop.idx ] != null ) {
9668                         same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
9669                         
return same;
9670                     }
9671                 });
9672             }
9673             
return same;
9674         });
9675         
return same;
9676     },
9677     _space: function() {
9678         
var used = [],
9679             inst =
this;
9680         each( spaces, function( spaceName, space ) {
9681             
if ( inst[ space.cache ] ) {
9682                 used.push( spaceName );
9683             }
9684         });
9685         
return used.pop();
9686     },
9687     transition: function( other, distance ) {
9688         
var end = color( other ),
9689             spaceName = end._space(),
9690             space = spaces[ spaceName ],
9691             startColor =
this.alpha() === 0 ? color( "transparent" ) : this,
9692             start = startColor[ space.cache ] || space.to( startColor._rgba ),
9693             result = start.slice();
9694
9695         end = end[ space.cache ];
9696         each( space.props, function( key, prop ) {
9697             
var index = prop.idx,
9698                 startValue = start[ index ],
9699                 endValue = end[ index ],
9700                 type = propTypes[ prop.type ] || {};
9701
9702             
// if null, don't override start value
9703             
if ( endValue === null ) {
9704                 
return;
9705             }
9706             
// if null - use end
9707             
if ( startValue === null ) {
9708                 result[ index ] = endValue;
9709             }
else {
9710                 
if ( type.mod ) {
9711                     
if ( endValue - startValue > type.mod / 2 ) {
9712                         startValue += type.mod;
9713                     }
else if ( startValue - endValue > type.mod / 2 ) {
9714                         startValue -= type.mod;
9715                     }
9716                 }
9717                 result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
9718             }
9719         });
9720         
return this[ spaceName ]( result );
9721     },
9722     blend: function( opaque ) {
9723         
// if we are already opaque - return ourself
9724         
if ( this._rgba[ 3 ] === 1 ) {
9725             
return this;
9726         }
9727
9728         
var rgb = this._rgba.slice(),
9729             a = rgb.pop(),
9730             blend = color( opaque )._rgba;
9731
9732         
return color( jQuery.map( rgb, function( v, i ) {
9733             
return ( 1 - a ) * blend[ i ] + a * v;
9734         }));
9735     },
9736     toRgbaString: function() {
9737         
var prefix = "rgba(",
9738             rgba = jQuery.map(
this._rgba, function( v, i ) {
9739                 
return v == null ? ( i > 2 ? 1 : 0 ) : v;
9740             });
9741
9742         
if ( rgba[ 3 ] === 1 ) {
9743             rgba.pop();
9744             prefix =
"rgb(";
9745         }
9746
9747         
return prefix + rgba.join() + ")";
9748     },
9749     toHslaString: function() {
9750         
var prefix = "hsla(",
9751             hsla = jQuery.map(
this.hsla(), function( v, i ) {
9752                 
if ( v == null ) {
9753                     v = i >
2 ? 1 : 0;
9754                 }
9755
9756                 
// catch 1 and 2
9757                 
if ( i && i < 3 ) {
9758                     v = Math.round( v *
100 ) + "%";
9759                 }
9760                 
return v;
9761             });
9762
9763         
if ( hsla[ 3 ] === 1 ) {
9764             hsla.pop();
9765             prefix =
"hsl(";
9766         }
9767         
return prefix + hsla.join() + ")";
9768     },
9769     toHexString: function( includeAlpha ) {
9770         
var rgba = this._rgba.slice(),
9771             alpha = rgba.pop();
9772
9773         
if ( includeAlpha ) {
9774             rgba.push( ~~( alpha *
255 ) );
9775         }
9776
9777         
return "#" + jQuery.map( rgba, function( v ) {
9778
9779             
// default to 0 when nulls exist
9780             v = ( v ||
0 ).toString( 16 );
9781             
return v.length === 1 ? "0" + v : v;
9782         }).
join("");
9783     },
9784     toString: function() {
9785         
return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
9786     }
9787 });
9788 color.fn.parse.prototype = color.fn;

9789
9790 // hsla conversions adapted
from:
9791 // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.
as?r=5021
9792
9793 function hue2rgb( p, q, h ) {
9794     h = ( h +
1 ) % 1;
9795     
if ( h * 6 < 1 ) {
9796         
return p + ( q - p ) * h * 6;
9797     }
9798     
if ( h * 2 < 1) {
9799         
return q;
9800     }
9801     
if ( h * 3 < 2 ) {
9802         
return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
9803     }
9804     
return p;
9805 }
9806
9807 spaces.hsla.to = function( rgba ) {
9808     
if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
9809         
return [ null, null, null, rgba[ 3 ] ];
9810     }
9811     
var r = rgba[ 0 ] / 255,
9812         g = rgba[
1 ] / 255,
9813         b = rgba[
2 ] / 255,
9814         a = rgba[
3 ],
9815         max = Math.max( r, g, b ),
9816         min = Math.min( r, g, b ),
9817         diff = max - min,
9818         
add = max + min,
9819         l =
add * 0.5,
9820         h, s;
9821
9822     
if ( min === max ) {
9823         h =
0;
9824     }
else if ( r === max ) {
9825         h = (
60 * ( g - b ) / diff ) + 360;
9826     }
else if ( g === max ) {
9827         h = (
60 * ( b - r ) / diff ) + 120;
9828     }
else {
9829         h = (
60 * ( r - g ) / diff ) + 240;
9830     }
9831
9832     
// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
9833     
// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
9834     
if ( diff === 0 ) {
9835         s =
0;
9836     }
else if ( l <= 0.5 ) {
9837         s = diff /
add;
9838     }
else {
9839         s = diff / (
2 - add );
9840     }
9841     
return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
9842 };
9843
9844 spaces.hsla.
from = function( hsla ) {
9845     
if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
9846         
return [ null, null, null, hsla[ 3 ] ];
9847     }
9848     
var h = hsla[ 0 ] / 360,
9849         s = hsla[
1 ],
9850         l = hsla[
2 ],
9851         a = hsla[
3 ],
9852         q = l <=
0.5 ? l * ( 1 + s ) : l + s - l * s,
9853         p =
2 * l - q;
9854
9855     
return [
9856         Math.round( hue2rgb( p, q, h + (
1 / 3 ) ) * 255 ),
9857         Math.round( hue2rgb( p, q, h ) *
255 ),
9858         Math.round( hue2rgb( p, q, h - (
1 / 3 ) ) * 255 ),
9859         a
9860     ];
9861 };
9862
9863 each( spaces, function( spaceName, space ) {
9864     
var props = space.props,
9865         cache = space.cache,
9866         to = space.to,
9867         
from = space.from;
9868
9869     
// makes rgba() and hsla()
9870     color.fn[ spaceName ] = function(
value ) {
9871
9872         
// generate a cache for this space if it doesn't exist
9873         
if ( to && !this[ cache ] ) {
9874             
this[ cache ] = to( this._rgba );
9875         }
9876         
if ( value === undefined ) {
9877             
return this[ cache ].slice();
9878         }
9879
9880         
var ret,
9881             type = jQuery.type(
value ),
9882             arr = ( type ===
"array" || type === "object" ) ? value : arguments,
9883             local =
this[ cache ].slice();
9884
9885         each( props, function( key, prop ) {
9886             
var val = arr[ type === "object" ? key : prop.idx ];
9887             
if ( val == null ) {
9888                 val = local[ prop.idx ];
9889             }
9890             local[ prop.idx ] = clamp( val, prop );
9891         });
9892
9893         
if ( from ) {
9894             ret = color(
from( local ) );
9895             ret[ cache ] = local;
9896             
return ret;
9897         }
else {
9898             
return color( local );
9899         }
9900     };
9901
9902     
// makes red() green() blue() alpha() hue() saturation() lightness()
9903     each( props, function( key, prop ) {
9904         
// alpha is included in more than one space
9905         
if ( color.fn[ key ] ) {
9906             
return;
9907         }
9908         color.fn[ key ] = function(
value ) {
9909             
var vtype = jQuery.type( value ),
9910                 fn = ( key ===
"alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
9911                 local =
this[ fn ](),
9912                 cur = local[ prop.idx ],
9913                 match;
9914
9915             
if ( vtype === "undefined" ) {
9916                 
return cur;
9917             }
9918
9919             
if ( vtype === "function" ) {
9920                 
value = value.call( this, cur );
9921                 vtype = jQuery.type(
value );
9922             }
9923             
if ( value == null && prop.empty ) {
9924                 
return this;
9925             }
9926             
if ( vtype === "string" ) {
9927                 match = rplusequals.exec(
value );
9928                 
if ( match ) {
9929                     
value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
9930                 }
9931             }
9932             local[ prop.idx ] =
value;
9933             
return this[ fn ]( local );
9934         };
9935     });
9936 });

9937
9938 //
add cssHook and .fx.step function for each named hook.
9939 // accept a space separated
string of properties
9940 color.hook = function( hook ) {
9941     
var hooks = hook.split( " " );
9942     each( hooks, function( i, hook ) {
9943         jQuery.cssHooks[ hook ] = {
9944             
set: function( elem, value ) {
9945                 
var parsed, curElem,
9946                     backgroundColor =
"";
9947
9948                 
if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
9949                     
value = color( parsed || value );
9950                     
if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
9951                         curElem = hook ===
"backgroundColor" ? elem.parentNode : elem;
9952                         
while (
9953                             (backgroundColor ===
"" || backgroundColor === "transparent") &&
9954                             curElem && curElem.style
9955                         ) {
9956                             
try {
9957                                 backgroundColor = jQuery.css( curElem,
"backgroundColor" );
9958                                 curElem = curElem.parentNode;
9959                             }
catch ( e ) {
9960                             }
9961                         }
9962
9963                         
value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
9964                             backgroundColor :
9965                             
"_default" );
9966                     }
9967
9968                     
value = value.toRgbaString();
9969                 }
9970                 
try {
9971                     elem.style[ hook ] =
value;
9972                 }
catch ( e ) {
9973                     
// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
9974                 }
9975             }
9976         };
9977         jQuery.fx.step[ hook ] = function( fx ) {
9978             
if ( !fx.colorInit ) {
9979                 fx.start = color( fx.elem, hook );
9980                 fx.end = color( fx.end );
9981                 fx.colorInit =
true;
9982             }
9983             jQuery.cssHooks[ hook ].
set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
9984         };
9985     });
9986
9987 };
9988
9989 color.hook( stepHooks );
9990
9991 jQuery.cssHooks.borderColor = {
9992     expand: function(
value ) {
9993         
var expanded = {};
9994
9995         each( [
"Top", "Right", "Bottom", "Left" ], function( i, part ) {
9996             expanded[
"border" + part + "Color" ] = value;
9997         });
9998         
return expanded;
9999     }
10000 };

10001
10002 // Basic color names only.
10003 // Usage of any of the other color names requires adding yourself or including
10004 // jquery.color.svg-names.js.

10005 colors = jQuery.Color.names = {
10006     
// 4.1. Basic color keywords
10007     aqua:
"#00ffff",
10008     black:
"#000000",
10009     blue:
"#0000ff",
10010     fuchsia:
"#ff00ff",
10011     gray:
"#808080",
10012     green:
"#008000",
10013     lime:
"#00ff00",
10014     maroon:
"#800000",
10015     navy:
"#000080",
10016     olive:
"#808000",
10017     purple:
"#800080",
10018     red:
"#ff0000",
10019     silver:
"#c0c0c0",
10020     teal:
"#008080",
10021     white:
"#ffffff",
10022     yellow:
"#ffff00",
10023
10024     
// 4.2.3. "transparent" color keyword
10025     transparent: [
null, null, null, 0 ],
10026
10027     _default:
"#ffffff"
10028 };
10029
10030 })( jQuery );

10031
10032 /******************************************************************************/
10033 /****************************** CLASS ANIMATIONS ******************************/
10034 /******************************************************************************/

10035 (function() {

10036
10037 var
classAnimationActions = [ "add", "remove", "toggle" ],
10038     shorthandStyles = {
10039         border:
1,
10040         borderBottom:
1,
10041         borderColor:
1,
10042         borderLeft:
1,
10043         borderRight:
1,
10044         borderTop:
1,
10045         borderWidth:
1,
10046         margin:
1,
10047         padding:
1
10048     };
10049
10050 $.each([
"borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
10051     $.fx.step[ prop ] = function( fx ) {
10052         
if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
10053             jQuery.style( fx.elem, prop, fx.end );
10054             fx.setAttr =
true;
10055         }
10056     };
10057 });
10058
10059 function getElementStyles( elem ) {
10060     
var key, len,
10061         style = elem.ownerDocument.defaultView ?
10062             elem.ownerDocument.defaultView.getComputedStyle( elem,
null ) :
10063             elem.currentStyle,
10064         styles = {};
10065
10066     
if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
10067         len = style.length;
10068         
while ( len-- ) {
10069             key = style[ len ];
10070             
if ( typeof style[ key ] === "string" ) {
10071                 styles[ $.camelCase( key ) ] = style[ key ];
10072             }
10073         }
10074     
// support: Opera, IE <9
10075     }
else {
10076         
for ( key in style ) {
10077             
if ( typeof style[ key ] === "string" ) {
10078                 styles[ key ] = style[ key ];
10079             }
10080         }
10081     }
10082
10083     
return styles;
10084 }
10085
10086 function styleDifference( oldStyle, newStyle ) {
10087     
var diff = {},
10088         name,
value;
10089
10090     
for ( name in newStyle ) {
10091         
value = newStyle[ name ];
10092         
if ( oldStyle[ name ] !== value ) {
10093             
if ( !shorthandStyles[ name ] ) {
10094                 
if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
10095                     diff[ name ] =
value;
10096                 }
10097             }
10098         }
10099     }
10100
10101     
return diff;
10102 }

10103
10104 // support: jQuery <
1.8
10105 if
( !$.fn.addBack ) {
10106     $.fn.addBack = function( selector ) {
10107         
return this.add( selector == null ?
10108             
this.prevObject : this.prevObject.filter( selector )
10109         );
10110     };
10111 }
10112
10113 $.effects.animateClass = function(
value, duration, easing, callback ) {
10114     
var o = $.speed( duration, easing, callback );
10115
10116     
return this.queue( function() {
10117         
var animated = $( this ),
10118             baseClass = animated.attr(
"class" ) || "",
10119             applyClassChange,
10120             allAnimations = o.children ? animated.find(
"*" ).addBack() : animated;
10121
10122         
// map the animated objects to store the original styles.
10123         allAnimations = allAnimations.map(function() {
10124             
var el = $( this );
10125             
return {
10126                 el: el,
10127                 start: getElementStyles(
this )
10128             };
10129         });
10130
10131         
// apply class change
10132         applyClassChange = function() {
10133             $.each( classAnimationActions, function(i, action) {
10134                 
if ( value[ action ] ) {
10135                     animated[ action +
"Class" ]( value[ action ] );
10136                 }
10137             });
10138         };
10139         applyClassChange();
10140
10141         
// map all animated objects again - calculate new styles and diff
10142         allAnimations = allAnimations.map(function() {
10143             
this.end = getElementStyles( this.el[ 0 ] );
10144             
this.diff = styleDifference( this.start, this.end );
10145             
return this;
10146         });
10147
10148         
// apply original class
10149         
animated.attr( "class", baseClass );
10150
10151         
// map all animated objects again - this time collecting a promise
10152         allAnimations = allAnimations.map(function() {
10153             
var styleInfo = this,
10154                 dfd = $.Deferred(),
10155                 opts = $.extend({}, o, {
10156                     queue:
false,
10157                     complete: function() {
10158                         dfd.resolve( styleInfo );
10159                     }
10160                 });
10161
10162             
this.el.animate( this.diff, opts );
10163             
return dfd.promise();
10164         });
10165
10166         
// once all animations have completed:
10167         $.
when.apply( $, allAnimations.get() ).done(function() {
10168
10169             
// set the final class
10170             
applyClassChange();
10171
10172             
// for each animated element,
10173             
// clear all css properties that were animated
10174             $.each( arguments, function() {
10175                 
var el = this.el;
10176                 $.each(
this.diff, function(key) {
10177                     el.css( key,
"" );
10178                 });
10179             });
10180
10181             
// this is guarnteed to be there if you use jQuery.speed()
10182             
// it also handles dequeuing the next anim...
10183             o.complete.call( animated[
0 ] );
10184         });
10185     });
10186 };
10187
10188 $.fn.extend({
10189     addClass: (function( orig ) {
10190         
return function( classNames, speed, easing, callback ) {
10191             
return speed ?
10192                 $.effects.animateClass.call(
this,
10193                     {
add: classNames }, speed, easing, callback ) :
10194                 orig.apply(
this, arguments );
10195         };
10196     })( $.fn.addClass ),
10197
10198     removeClass: (function( orig ) {
10199         
return function( classNames, speed, easing, callback ) {
10200             
return arguments.length > 1 ?
10201                 $.effects.animateClass.call(
this,
10202                     {
remove: classNames }, speed, easing, callback ) :
10203                 orig.apply(
this, arguments );
10204         };
10205     })( $.fn.removeClass ),
10206
10207     toggleClass: (function( orig ) {
10208         
return function( classNames, force, speed, easing, callback ) {
10209             
if ( typeof force === "boolean" || force === undefined ) {
10210                 
if ( !speed ) {
10211                     
// without speed parameter
10212                     
return orig.apply( this, arguments );
10213                 }
else {
10214                     
return $.effects.animateClass.call( this,
10215                         (force ? {
add: classNames } : { remove: classNames }),
10216                         speed, easing, callback );
10217                 }
10218             }
else {
10219                 
// without force parameter
10220                 
return $.effects.animateClass.call( this,
10221                     { toggle: classNames }, force, speed, easing );
10222             }
10223         };
10224     })( $.fn.toggleClass ),
10225
10226     switchClass: function(
remove, add, speed, easing, callback) {
10227         
return $.effects.animateClass.call( this, {
10228             
add: add,
10229             
remove: remove
10230         }, speed, easing, callback );
10231     }
10232 });
10233
10234 })();

10235
10236 /******************************************************************************/
10237 /*********************************** EFFECTS **********************************/
10238 /******************************************************************************/

10239
10240 (function() {
10241
10242 $.extend( $.effects, {
10243     version:
"1.11.4",
10244
10245     
// Saves a set of properties in a data storage
10246     save: function( element,
set ) {
10247         
for ( var i = 0; i < set.length; i++ ) {
10248             
if ( set[ i ] !== null ) {
10249                 element.data( dataSpace +
set[ i ], element[ 0 ].style[ set[ i ] ] );
10250             }
10251         }
10252     },
10253
10254     
// Restores a set of previously saved properties from a data storage
10255     restore: function( element,
set ) {
10256         
var val, i;
10257         
for ( i = 0; i < set.length; i++ ) {
10258             
if ( set[ i ] !== null ) {
10259                 val = element.data( dataSpace +
set[ i ] );
10260                 
// support: jQuery 1.6.2
10261                 
// http://bugs.jquery.com/ticket/9917
10262                 
// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
10263                 
// We can't differentiate between "" and 0 here, so we just assume
10264                 
// empty string since it's likely to be a more common value...
10265                 
if ( val === undefined ) {
10266                     val =
"";
10267                 }
10268                 element.css(
set[ i ], val );
10269             }
10270         }
10271     },
10272
10273     setMode: function( el, mode ) {
10274         
if (mode === "toggle") {
10275             mode = el.
is( ":hidden" ) ? "show" : "hide";
10276         }
10277         
return mode;
10278     },
10279
10280     
// Translates a [top,left] array into a baseline value
10281     
// this should be a little more flexible in the future to handle a string & hash
10282     getBaseline: function( origin, original ) {
10283         
var y, x;
10284         
switch ( origin[ 0 ] ) {
10285             
case "top": y = 0; break;
10286             
case "middle": y = 0.5; break;
10287             
case "bottom": y = 1; break;
10288             
default: y = origin[ 0 ] / original.height;
10289         }
10290         
switch ( origin[ 1 ] ) {
10291             
case "left": x = 0; break;
10292             
case "center": x = 0.5; break;
10293             
case "right": x = 1; break;
10294             
default: x = origin[ 1 ] / original.width;
10295         }
10296         
return {
10297             x: x,
10298             y: y
10299         };
10300     },
10301
10302     
// Wraps the element around a wrapper that copies position properties
10303     createWrapper: function( element ) {
10304
10305         
// if the element is already wrapped, return it
10306         
if ( element.parent().is( ".ui-effects-wrapper" )) {
10307             
return element.parent();
10308         }
10309
10310         
// wrap the element
10311         
var props = {
10312                 width: element.outerWidth(
true),
10313                 height: element.outerHeight(
true),
10314                 
"float": element.css( "float" )
10315             },
10316             wrapper = $(
"<div></div>" )
10317                 .addClass(
"ui-effects-wrapper" )
10318                 .css({
10319                     fontSize:
"100%",
10320                     background:
"transparent",
10321                     border:
"none",
10322                     margin:
0,
10323                     padding:
0
10324                 }),
10325             
// Store the size in case width/height are defined in % - Fixes #5245
10326             size = {
10327                 width: element.width(),
10328                 height: element.height()
10329             },
10330             active = document.activeElement;
10331
10332         
// support: Firefox
10333         
// Firefox incorrectly exposes anonymous content
10334         
// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
10335         
try {
10336             active.id;
10337         }
catch ( e ) {
10338             active = document.body;
10339         }
10340
10341         element.wrap( wrapper );
10342
10343         
// Fixes #7595 - Elements lose focus when wrapped.
10344         
if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
10345             $( active ).focus();
10346         }
10347
10348         wrapper = element.parent();
//Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
10349
10350         
// transfer positioning properties to the wrapper
10351         
if ( element.css( "position" ) === "static" ) {
10352             wrapper.css({ position:
"relative" });
10353             element.css({ position:
"relative" });
10354         }
else {
10355             $.extend( props, {
10356                 position: element.css(
"position" ),
10357                 zIndex: element.css(
"z-index" )
10358             });
10359             $.each([
"top", "left", "bottom", "right" ], function(i, pos) {
10360                 props[ pos ] = element.css( pos );
10361                 
if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
10362                     props[ pos ] =
"auto";
10363                 }
10364             });
10365             element.css({
10366                 position:
"relative",
10367                 top:
0,
10368                 left:
0,
10369                 right:
"auto",
10370                 bottom:
"auto"
10371             });
10372         }
10373         element.css(size);
10374
10375         
return wrapper.css( props ).show();
10376     },
10377
10378     removeWrapper: function( element ) {
10379         
var active = document.activeElement;
10380
10381         
if ( element.parent().is( ".ui-effects-wrapper" ) ) {
10382             element.parent().replaceWith( element );
10383
10384             
// Fixes #7595 - Elements lose focus when wrapped.
10385             
if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
10386                 $( active ).focus();
10387             }
10388         }
10389
10390         
return element;
10391     },
10392
10393     setTransition: function( element, list, factor,
value ) {
10394         
value = value || {};
10395         $.each( list, function( i, x ) {
10396             
var unit = element.cssUnit( x );
10397             
if ( unit[ 0 ] > 0 ) {
10398                 
value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
10399             }
10400         });
10401         
return value;
10402     }
10403 });

10404
10405 //
return an effect options object for the given parameters:
10406 function _normalizeArguments( effect, options, speed, callback ) {
10407
10408     
// allow passing all options as the first parameter
10409     
if ( $.isPlainObject( effect ) ) {
10410         options = effect;
10411         effect = effect.effect;
10412     }
10413
10414     
// convert to an object
10415     effect = { effect: effect };
10416
10417     
// catch (effect, null, ...)
10418     
if ( options == null ) {
10419         options = {};
10420     }
10421
10422     
// catch (effect, callback)
10423     
if ( $.isFunction( options ) ) {
10424         callback = options;
10425         speed =
null;
10426         options = {};
10427     }
10428
10429     
// catch (effect, speed, ?)
10430     
if ( typeof options === "number" || $.fx.speeds[ options ] ) {
10431         callback = speed;
10432         speed = options;
10433         options = {};
10434     }
10435
10436     
// catch (effect, options, callback)
10437     
if ( $.isFunction( speed ) ) {
10438         callback = speed;
10439         speed =
null;
10440     }
10441
10442     
// add options to effect
10443     
if ( options ) {
10444         $.extend( effect, options );
10445     }
10446
10447     speed = speed || options.duration;
10448     effect.duration = $.fx.off ?
0 :
10449         
typeof speed === "number" ? speed :
10450         speed
in $.fx.speeds ? $.fx.speeds[ speed ] :
10451         $.fx.speeds._default;
10452
10453     effect.complete = callback || options.complete;
10454
10455     
return effect;
10456 }
10457
10458 function standardAnimationOption( option ) {
10459     
// Valid standard speeds (nothing, number, named speed)
10460     
if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
10461         
return true;
10462     }
10463
10464     
// Invalid strings - treat as "normal" speed
10465     
if ( typeof option === "string" && !$.effects.effect[ option ] ) {
10466         
return true;
10467     }
10468
10469     
// Complete callback
10470     
if ( $.isFunction( option ) ) {
10471         
return true;
10472     }
10473
10474     
// Options hash (but not naming an effect)
10475     
if ( typeof option === "object" && !option.effect ) {
10476         
return true;
10477     }
10478
10479     
// Didn't match any standard API
10480     
return false;
10481 }
10482
10483 $.fn.extend({
10484     effect: function(
/* effect, options, speed, callback */ ) {
10485         
var args = _normalizeArguments.apply( this, arguments ),
10486             mode = args.mode,
10487             queue = args.queue,
10488             effectMethod = $.effects.effect[ args.effect ];
10489
10490         
if ( $.fx.off || !effectMethod ) {
10491             
// delegate to the original method (e.g., .show()) if possible
10492             
if ( mode ) {
10493                 
return this[ mode ]( args.duration, args.complete );
10494             }
else {
10495                 
return this.each( function() {
10496                     
if ( args.complete ) {
10497                         args.complete.call(
this );
10498                     }
10499                 });
10500             }
10501         }
10502
10503         function run( next ) {
10504             
var elem = $( this ),
10505                 complete = args.complete,
10506                 mode = args.mode;
10507
10508             function done() {
10509                 
if ( $.isFunction( complete ) ) {
10510                     complete.call( elem[
0] );
10511                 }
10512                 
if ( $.isFunction( next ) ) {
10513                     next();
10514                 }
10515             }
10516
10517             
// If the element already has the correct final state, delegate to
10518             
// the core methods so the internal tracking of "olddisplay" works.
10519             
if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
10520                 elem[ mode ]();
10521                 done();
10522             }
else {
10523                 effectMethod.call( elem[
0], args, done );
10524             }
10525         }
10526
10527         
return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
10528     },
10529
10530     show: (function( orig ) {
10531         
return function( option ) {
10532             
if ( standardAnimationOption( option ) ) {
10533                 
return orig.apply( this, arguments );
10534             }
else {
10535                 
var args = _normalizeArguments.apply( this, arguments );
10536                 args.mode =
"show";
10537                 
return this.effect.call( this, args );
10538             }
10539         };
10540     })( $.fn.show ),
10541
10542     hide: (function( orig ) {
10543         
return function( option ) {
10544             
if ( standardAnimationOption( option ) ) {
10545                 
return orig.apply( this, arguments );
10546             }
else {
10547                 
var args = _normalizeArguments.apply( this, arguments );
10548                 args.mode =
"hide";
10549                 
return this.effect.call( this, args );
10550             }
10551         };
10552     })( $.fn.hide ),
10553
10554     toggle: (function( orig ) {
10555         
return function( option ) {
10556             
if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
10557                 
return orig.apply( this, arguments );
10558             }
else {
10559                 
var args = _normalizeArguments.apply( this, arguments );
10560                 args.mode =
"toggle";
10561                 
return this.effect.call( this, args );
10562             }
10563         };
10564     })( $.fn.toggle ),
10565
10566     
// helper functions
10567     cssUnit: function(key) {
10568         
var style = this.css( key ),
10569             val = [];
10570
10571         $.each( [
"em", "px", "%", "pt" ], function( i, unit ) {
10572             
if ( style.indexOf( unit ) > 0 ) {
10573                 val = [ parseFloat( style ), unit ];
10574             }
10575         });
10576         
return val;
10577     }
10578 });
10579
10580 })();

10581
10582 /******************************************************************************/
10583 /*********************************** EASING ***********************************/
10584 /******************************************************************************/

10585
10586 (function() {

10587
10588 // based
on easing equations from Robert Penner (http://www.robertpenner.com/easing)
10589
10590 var
baseEasings = {};
10591
10592 $.each( [
"Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
10593     baseEasings[ name ] = function( p ) {
10594         
return Math.pow( p, i + 2 );
10595     };
10596 });
10597
10598 $.extend( baseEasings, {
10599     Sine: function( p ) {
10600         
return 1 - Math.cos( p * Math.PI / 2 );
10601     },
10602     Circ: function( p ) {
10603         
return 1 - Math.sqrt( 1 - p * p );
10604     },
10605     Elastic: function( p ) {
10606         
return p === 0 || p === 1 ? p :
10607             -Math.pow(
2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
10608     },
10609     Back: function( p ) {
10610         
return p * p * ( 3 * p - 2 );
10611     },
10612     Bounce: function( p ) {
10613         
var pow2,
10614             bounce =
4;
10615
10616         
while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
10617         
return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
10618     }
10619 });
10620
10621 $.each( baseEasings, function( name, easeIn ) {
10622     $.easing[
"easeIn" + name ] = easeIn;
10623     $.easing[
"easeOut" + name ] = function( p ) {
10624         
return 1 - easeIn( 1 - p );
10625     };
10626     $.easing[
"easeInOut" + name ] = function( p ) {
10627         
return p < 0.5 ?
10628             easeIn( p *
2 ) / 2 :
10629             
1 - easeIn( p * -2 + 2 ) / 2;
10630     };
10631 });
10632
10633 })();

10634
10635 var
effect = $.effects;
10636
10637
10638 /*!
10639  * jQuery UI Effects Blind
1.11.4
10640  * http://jqueryui.com
10641  *
10642  * Copyright jQuery Foundation and other contributors
10643  * Released under the MIT license.
10644  * http://jquery.org/license
10645  *
10646  * http://api.jqueryui.com/blind-effect/
10647  */

10648
10649
10650 var
effectBlind = $.effects.effect.blind = function( o, done ) {
10651     
// Create element
10652     
var el = $( this ),
10653         rvertical = /up|down|vertical/,
10654         rpositivemotion = /up|left|vertical|horizontal/,
10655         props = [
"position", "top", "bottom", "left", "right", "height", "width" ],
10656         mode = $.effects.setMode( el, o.mode ||
"hide" ),
10657         direction = o.direction ||
"up",
10658         vertical = rvertical.test( direction ),
10659         
ref = vertical ? "height" : "width",
10660         ref2 = vertical ?
"top" : "left",
10661         motion = rpositivemotion.test( direction ),
10662         animation = {},
10663         show = mode ===
"show",
10664         wrapper, distance, margin;
10665
10666     
// if already wrapped, the wrapper's properties are my property. #6245
10667     
if ( el.parent().is( ".ui-effects-wrapper" ) ) {
10668         $.effects.save( el.parent(), props );
10669     }
else {
10670         $.effects.save( el, props );
10671     }
10672     el.show();
10673     wrapper = $.effects.createWrapper( el ).css({
10674         overflow:
"hidden"
10675     });
10676
10677     distance = wrapper[
ref ]();
10678     margin = parseFloat( wrapper.css( ref2 ) ) ||
0;
10679
10680     animation[
ref ] = show ? distance : 0;
10681     
if ( !motion ) {
10682         el
10683             .css( vertical ?
"bottom" : "right", 0 )
10684             .css( vertical ?
"top" : "left", "auto" )
10685             .css({ position:
"absolute" });
10686
10687         animation[ ref2 ] = show ? margin : distance + margin;
10688     }
10689
10690     
// start at 0 if we are showing
10691     
if ( show ) {
10692         wrapper.css(
ref, 0 );
10693         
if ( !motion ) {
10694             wrapper.css( ref2, margin + distance );
10695         }
10696     }
10697
10698     
// Animate
10699     wrapper.animate( animation, {
10700         duration: o.duration,
10701         easing: o.easing,
10702         queue:
false,
10703         complete: function() {
10704             
if ( mode === "hide" ) {
10705                 el.hide();
10706             }
10707             $.effects.restore( el, props );
10708             $.effects.removeWrapper( el );
10709             done();
10710         }
10711     });
10712 };

10713
10714
10715 /*!
10716  * jQuery UI Effects Bounce
1.11.4
10717  * http://jqueryui.com
10718  *
10719  * Copyright jQuery Foundation and other contributors
10720  * Released under the MIT license.
10721  * http://jquery.org/license
10722  *
10723  * http://api.jqueryui.com/bounce-effect/
10724  */

10725
10726
10727 var
effectBounce = $.effects.effect.bounce = function( o, done ) {
10728     
var el = $( this ),
10729         props = [
"position", "top", "bottom", "left", "right", "height", "width" ],
10730
10731         
// defaults:
10732         mode = $.effects.setMode( el, o.mode ||
"effect" ),
10733         hide = mode ===
"hide",
10734         show = mode ===
"show",
10735         direction = o.direction ||
"up",
10736         distance = o.distance,
10737         times = o.times ||
5,
10738
10739         
// number of internal animations
10740         anims = times *
2 + ( show || hide ? 1 : 0 ),
10741         speed = o.duration / anims,
10742         easing = o.easing,
10743
10744         
// utility:
10745         
ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10746         motion = ( direction ===
"up" || direction === "left" ),
10747         i,
10748         upAnim,
10749         downAnim,
10750
10751         
// we will need to re-assemble the queue to stack our animations in place
10752         queue = el.queue(),
10753         queuelen = queue.length;
10754
10755     
// Avoid touching opacity to prevent clearType and PNG issues in IE
10756     
if ( show || hide ) {
10757         props.push(
"opacity" );
10758     }
10759
10760     $.effects.save( el, props );
10761     el.show();
10762     $.effects.createWrapper( el );
// Create Wrapper
10763
10764     
// default distance for the BIGGEST bounce is the outer Distance / 3
10765     
if ( !distance ) {
10766         distance = el[
ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
10767     }
10768
10769     
if ( show ) {
10770         downAnim = { opacity:
1 };
10771         downAnim[
ref ] = 0;
10772
10773         
// if we are showing, force opacity 0 and set the initial position
10774         
// then do the "first" animation
10775         el.css(
"opacity", 0 )
10776             .css(
ref, motion ? -distance * 2 : distance * 2 )
10777             .animate( downAnim, speed, easing );
10778     }
10779
10780     
// start at the smallest distance if we are hiding
10781     
if ( hide ) {
10782         distance = distance / Math.pow(
2, times - 1 );
10783     }
10784
10785     downAnim = {};
10786     downAnim[
ref ] = 0;
10787     
// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
10788     
for ( i = 0; i < times; i++ ) {
10789         upAnim = {};
10790         upAnim[
ref ] = ( motion ? "-=" : "+=" ) + distance;
10791
10792         el.animate( upAnim, speed, easing )
10793             .animate( downAnim, speed, easing );
10794
10795         distance = hide ? distance *
2 : distance / 2;
10796     }
10797
10798     
// Last Bounce when Hiding
10799     
if ( hide ) {
10800         upAnim = { opacity:
0 };
10801         upAnim[
ref ] = ( motion ? "-=" : "+=" ) + distance;
10802
10803         el.animate( upAnim, speed, easing );
10804     }
10805
10806     el.queue(function() {
10807         
if ( hide ) {
10808             el.hide();
10809         }
10810         $.effects.restore( el, props );
10811         $.effects.removeWrapper( el );
10812         done();
10813     });
10814
10815     
// inject all the animations we just queued to be first in line (after "inprogress")
10816     
if ( queuelen > 1) {
10817         queue.splice.apply( queue,
10818             [
1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
10819     }
10820     el.dequeue();
10821
10822 };

10823
10824
10825 /*!
10826  * jQuery UI Effects Clip
1.11.4
10827  * http://jqueryui.com
10828  *
10829  * Copyright jQuery Foundation and other contributors
10830  * Released under the MIT license.
10831  * http://jquery.org/license
10832  *
10833  * http://api.jqueryui.com/clip-effect/
10834  */

10835
10836
10837 var
effectClip = $.effects.effect.clip = function( o, done ) {
10838     
// Create element
10839     
var el = $( this ),
10840         props = [
"position", "top", "bottom", "left", "right", "height", "width" ],
10841         mode = $.effects.setMode( el, o.mode ||
"hide" ),
10842         show = mode ===
"show",
10843         direction = o.direction ||
"vertical",
10844         vert = direction ===
"vertical",
10845         size = vert ?
"height" : "width",
10846         position = vert ?
"top" : "left",
10847         animation = {},
10848         wrapper, animate, distance;
10849
10850     
// Save & Show
10851     $.effects.save( el, props );
10852     el.show();
10853
10854     
// Create Wrapper
10855     wrapper = $.effects.createWrapper( el ).css({
10856         overflow:
"hidden"
10857     });
10858     animate = ( el[
0].tagName === "IMG" ) ? wrapper : el;
10859     distance = animate[ size ]();
10860
10861     
// Shift
10862     
if ( show ) {
10863         animate.css( size,
0 );
10864         animate.css( position, distance /
2 );
10865     }
10866
10867     
// Create Animation Object:
10868     animation[ size ] = show ? distance :
0;
10869     animation[ position ] = show ?
0 : distance / 2;
10870
10871     
// Animate
10872     animate.animate( animation, {
10873         queue:
false,
10874         duration: o.duration,
10875         easing: o.easing,
10876         complete: function() {
10877             
if ( !show ) {
10878                 el.hide();
10879             }
10880             $.effects.restore( el, props );
10881             $.effects.removeWrapper( el );
10882             done();
10883         }
10884     });
10885
10886 };

10887
10888
10889 /*!
10890  * jQuery UI Effects Drop
1.11.4
10891  * http://jqueryui.com
10892  *
10893  * Copyright jQuery Foundation and other contributors
10894  * Released under the MIT license.
10895  * http://jquery.org/license
10896  *
10897  * http://api.jqueryui.com/drop-effect/
10898  */

10899
10900
10901 var
effectDrop = $.effects.effect.drop = function( o, done ) {
10902
10903     
var el = $( this ),
10904         props = [
"position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
10905         mode = $.effects.setMode( el, o.mode ||
"hide" ),
10906         show = mode ===
"show",
10907         direction = o.direction ||
"left",
10908         
ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10909         motion = ( direction ===
"up" || direction === "left" ) ? "pos" : "neg",
10910         animation = {
10911             opacity: show ?
1 : 0
10912         },
10913         distance;
10914
10915     
// Adjust
10916     $.effects.save( el, props );
10917     el.show();
10918     $.effects.createWrapper( el );
10919
10920     distance = o.distance || el[
ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
10921
10922     
if ( show ) {
10923         el
10924             .css(
"opacity", 0 )
10925             .css(
ref, motion === "pos" ? -distance : distance );
10926     }
10927
10928     
// Animation
10929     animation[
ref ] = ( show ?
10930         ( motion ===
"pos" ? "+=" : "-=" ) :
10931         ( motion ===
"pos" ? "-=" : "+=" ) ) +
10932         distance;
10933
10934     
// Animate
10935     el.animate( animation, {
10936         queue:
false,
10937         duration: o.duration,
10938         easing: o.easing,
10939         complete: function() {
10940             
if ( mode === "hide" ) {
10941                 el.hide();
10942             }
10943             $.effects.restore( el, props );
10944             $.effects.removeWrapper( el );
10945             done();
10946         }
10947     });
10948 };

10949
10950
10951 /*!
10952  * jQuery UI Effects Explode
1.11.4
10953  * http://jqueryui.com
10954  *
10955  * Copyright jQuery Foundation and other contributors
10956  * Released under the MIT license.
10957  * http://jquery.org/license
10958  *
10959  * http://api.jqueryui.com/explode-effect/
10960  */

10961
10962
10963 var
effectExplode = $.effects.effect.explode = function( o, done ) {
10964
10965     
var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
10966         cells = rows,
10967         el = $(
this ),
10968         mode = $.effects.setMode( el, o.mode ||
"hide" ),
10969         show = mode ===
"show",
10970
10971         
// show and then visibility:hidden the element before calculating offset
10972         offset = el.show().css(
"visibility", "hidden" ).offset(),
10973
10974         
// width and height of a piece
10975         width = Math.ceil( el.outerWidth() / cells ),
10976         height = Math.ceil( el.outerHeight() / rows ),
10977         pieces = [],
10978
10979         
// loop
10980         i, j, left, top, mx, my;
10981
10982     
// children animate complete:
10983     function childComplete() {
10984         pieces.push(
this );
10985         
if ( pieces.length === rows * cells ) {
10986             animComplete();
10987         }
10988     }
10989
10990     
// clone the element for each row and cell.
10991     
for ( i = 0; i < rows ; i++ ) { // ===>
10992         top = offset.top + i * height;
10993         my = i - ( rows -
1 ) / 2 ;
10994
10995         
for ( j = 0; j < cells ; j++ ) { // |||
10996             left = offset.left + j * width;
10997             mx = j - ( cells -
1 ) / 2 ;
10998
10999             
// Create a clone of the now hidden main element that will be absolute positioned
11000             
// within a wrapper div off the -left and -top equal to size of our pieces
11001             el
11002                 .clone()
11003                 .appendTo(
"body" )
11004                 .wrap(
"<div></div>" )
11005                 .css({
11006                     position:
"absolute",
11007                     visibility:
"visible",
11008                     left: -j * width,
11009                     top: -i * height
11010                 })
11011
11012             
// select the wrapper - make it overflow: hidden and absolute positioned based on
11013             
// where the original was located +left and +top equal to the size of pieces
11014                 .parent()
11015                 .addClass(
"ui-effects-explode" )
11016                 .css({
11017                     position:
"absolute",
11018                     overflow:
"hidden",
11019                     width: width,
11020                     height: height,
11021                     left: left + ( show ? mx * width :
0 ),
11022                     top: top + ( show ? my * height :
0 ),
11023                     opacity: show ?
0 : 1
11024                 }).animate({
11025                     left: left + ( show ?
0 : mx * width ),
11026                     top: top + ( show ?
0 : my * height ),
11027                     opacity: show ?
1 : 0
11028                 }, o.duration ||
500, o.easing, childComplete );
11029         }
11030     }
11031
11032     function animComplete() {
11033         el.css({
11034             visibility:
"visible"
11035         });
11036         $( pieces ).
remove();
11037         
if ( !show ) {
11038             el.hide();
11039         }
11040         done();
11041     }
11042 };

11043
11044
11045 /*!
11046  * jQuery UI Effects Fade
1.11.4
11047  * http://jqueryui.com
11048  *
11049  * Copyright jQuery Foundation and other contributors
11050  * Released under the MIT license.
11051  * http://jquery.org/license
11052  *
11053  * http://api.jqueryui.com/fade-effect/
11054  */

11055
11056
11057 var
effectFade = $.effects.effect.fade = function( o, done ) {
11058     
var el = $( this ),
11059         mode = $.effects.setMode( el, o.mode ||
"toggle" );
11060
11061     el.animate({
11062         opacity: mode
11063     }, {
11064         queue:
false,
11065         duration: o.duration,
11066         easing: o.easing,
11067         complete: done
11068     });
11069 };

11070
11071
11072 /*!
11073  * jQuery UI Effects Fold
1.11.4
11074  * http://jqueryui.com
11075  *
11076  * Copyright jQuery Foundation and other contributors
11077  * Released under the MIT license.
11078  * http://jquery.org/license
11079  *
11080  * http://api.jqueryui.com/fold-effect/
11081  */

11082
11083
11084 var
effectFold = $.effects.effect.fold = function( o, done ) {
11085
11086     
// Create element
11087     
var el = $( this ),
11088         props = [
"position", "top", "bottom", "left", "right", "height", "width" ],
11089         mode = $.effects.setMode( el, o.mode ||
"hide" ),
11090         show = mode ===
"show",
11091         hide = mode ===
"hide",
11092         size = o.size ||
15,
11093         percent = /([
0-9]+)%/.exec( size ),
11094         horizFirst = !!o.horizFirst,
11095         widthFirst = show !== horizFirst,
11096         
ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
11097         duration = o.duration /
2,
11098         wrapper, distance,
11099         animation1 = {},
11100         animation2 = {};
11101
11102     $.effects.save( el, props );
11103     el.show();
11104
11105     
// Create Wrapper
11106     wrapper = $.effects.createWrapper( el ).css({
11107         overflow:
"hidden"
11108     });
11109     distance = widthFirst ?
11110         [ wrapper.width(), wrapper.height() ] :
11111         [ wrapper.height(), wrapper.width() ];
11112
11113     
if ( percent ) {
11114         size = parseInt( percent[
1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
11115     }
11116     
if ( show ) {
11117         wrapper.css( horizFirst ? {
11118             height:
0,
11119             width: size
11120         } : {
11121             height: size,
11122             width:
0
11123         });
11124     }
11125
11126     
// Animation
11127     animation1[
ref[ 0 ] ] = show ? distance[ 0 ] : size;
11128     animation2[
ref[ 1 ] ] = show ? distance[ 1 ] : 0;
11129
11130     
// Animate
11131     wrapper
11132         .animate( animation1, duration, o.easing )
11133         .animate( animation2, duration, o.easing, function() {
11134             
if ( hide ) {
11135                 el.hide();
11136             }
11137             $.effects.restore( el, props );
11138             $.effects.removeWrapper( el );
11139             done();
11140         });
11141
11142 };

11143
11144
11145 /*!
11146  * jQuery UI Effects Highlight
1.11.4
11147  * http://jqueryui.com
11148  *
11149  * Copyright jQuery Foundation and other contributors
11150  * Released under the MIT license.
11151  * http://jquery.org/license
11152  *
11153  * http://api.jqueryui.com/highlight-effect/
11154  */

11155
11156
11157 var
effectHighlight = $.effects.effect.highlight = function( o, done ) {
11158     
var elem = $( this ),
11159         props = [
"backgroundImage", "backgroundColor", "opacity" ],
11160         mode = $.effects.setMode( elem, o.mode ||
"show" ),
11161         animation = {
11162             backgroundColor: elem.css(
"backgroundColor" )
11163         };
11164
11165     
if (mode === "hide") {
11166         animation.opacity =
0;
11167     }
11168
11169     $.effects.save( elem, props );
11170
11171     elem
11172         .show()
11173         .css({
11174             backgroundImage:
"none",
11175             backgroundColor: o.color ||
"#ffff99"
11176         })
11177         .animate( animation, {
11178             queue:
false,
11179             duration: o.duration,
11180             easing: o.easing,
11181             complete: function() {
11182                 
if ( mode === "hide" ) {
11183                     elem.hide();
11184                 }
11185                 $.effects.restore( elem, props );
11186                 done();
11187             }
11188         });
11189 };

11190
11191
11192 /*!
11193  * jQuery UI Effects Size
1.11.4
11194  * http://jqueryui.com
11195  *
11196  * Copyright jQuery Foundation and other contributors
11197  * Released under the MIT license.
11198  * http://jquery.org/license
11199  *
11200  * http://api.jqueryui.com/size-effect/
11201  */

11202
11203
11204 var
effectSize = $.effects.effect.size = function( o, done ) {
11205
11206     
// Create element
11207     
var original, baseline, factor,
11208         el = $(
this ),
11209         props0 = [
"position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
11210
11211         
// Always restore
11212         props1 = [
"position", "top", "bottom", "left", "right", "overflow", "opacity" ],
11213
11214         
// Copy for children
11215         props2 = [
"width", "height", "overflow" ],
11216         cProps = [
"fontSize" ],
11217         vProps = [
"borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
11218         hProps = [
"borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
11219
11220         
// Set options
11221         mode = $.effects.setMode( el, o.mode ||
"effect" ),
11222         restore = o.restore || mode !==
"effect",
11223         scale = o.scale ||
"both",
11224         origin = o.origin || [
"middle", "center" ],
11225         position = el.css(
"position" ),
11226         props = restore ? props0 : props1,
11227         zero = {
11228             height:
0,
11229             width:
0,
11230             outerHeight:
0,
11231             outerWidth:
0
11232         };
11233
11234     
if ( mode === "show" ) {
11235         el.show();
11236     }
11237     original = {
11238         height: el.height(),
11239         width: el.width(),
11240         outerHeight: el.outerHeight(),
11241         outerWidth: el.outerWidth()
11242     };
11243
11244     
if ( o.mode === "toggle" && mode === "show" ) {
11245         el.
from = o.to || zero;
11246         el.to = o.
from || original;
11247     }
else {
11248         el.
from = o.from || ( mode === "show" ? zero : original );
11249         el.to = o.to || ( mode ===
"hide" ? zero : original );
11250     }
11251
11252     
// Set scaling factor
11253     factor = {
11254         
from: {
11255             y: el.
from.height / original.height,
11256             x: el.
from.width / original.width
11257         },
11258         to: {
11259             y: el.to.height / original.height,
11260             x: el.to.width / original.width
11261         }
11262     };
11263
11264     
// Scale the css box
11265     
if ( scale === "box" || scale === "both" ) {
11266
11267         
// Vertical props scaling
11268         
if ( factor.from.y !== factor.to.y ) {
11269             props = props.concat( vProps );
11270             el.
from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
11271             el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
11272         }
11273
11274         
// Horizontal props scaling
11275         
if ( factor.from.x !== factor.to.x ) {
11276             props = props.concat( hProps );
11277             el.
from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
11278             el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
11279         }
11280     }
11281
11282     
// Scale the content
11283     
if ( scale === "content" || scale === "both" ) {
11284
11285         
// Vertical props scaling
11286         
if ( factor.from.y !== factor.to.y ) {
11287             props = props.concat( cProps ).concat( props2 );
11288             el.
from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
11289             el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
11290         }
11291     }
11292
11293     $.effects.save( el, props );
11294     el.show();
11295     $.effects.createWrapper( el );
11296     el.css(
"overflow", "hidden" ).css( el.from );
11297
11298     
// Adjust
11299     
if (origin) { // Calculate baseline shifts
11300         baseline = $.effects.getBaseline( origin, original );
11301         el.
from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
11302         el.
from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
11303         el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
11304         el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
11305     }
11306     el.css( el.
from ); // set top & left
11307
11308     
// Animate
11309     
if ( scale === "content" || scale === "both" ) { // Scale the children
11310
11311         
// Add margins/font-size
11312         vProps = vProps.concat([
"marginTop", "marginBottom" ]).concat(cProps);
11313         hProps = hProps.concat([
"marginLeft", "marginRight" ]);
11314         props2 = props0.concat(vProps).concat(hProps);
11315
11316         el.find(
"*[width]" ).each( function() {
11317             
var child = $( this ),
11318                 c_original = {
11319                     height: child.height(),
11320                     width: child.width(),
11321                     outerHeight: child.outerHeight(),
11322                     outerWidth: child.outerWidth()
11323                 };
11324             
if (restore) {
11325                 $.effects.save(child, props2);
11326             }
11327
11328             child.
from = {
11329                 height: c_original.height * factor.
from.y,
11330                 width: c_original.width * factor.
from.x,
11331                 outerHeight: c_original.outerHeight * factor.
from.y,
11332                 outerWidth: c_original.outerWidth * factor.
from.x
11333             };
11334             child.to = {
11335                 height: c_original.height * factor.to.y,
11336                 width: c_original.width * factor.to.x,
11337                 outerHeight: c_original.height * factor.to.y,
11338                 outerWidth: c_original.width * factor.to.x
11339             };
11340
11341             
// Vertical props scaling
11342             
if ( factor.from.y !== factor.to.y ) {
11343                 child.
from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
11344                 child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
11345             }
11346
11347             
// Horizontal props scaling
11348             
if ( factor.from.x !== factor.to.x ) {
11349                 child.
from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
11350                 child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
11351             }
11352
11353             
// Animate children
11354             child.css( child.
from );
11355             child.animate( child.to, o.duration, o.easing, function() {
11356
11357                 
// Restore children
11358                 
if ( restore ) {
11359                     $.effects.restore( child, props2 );
11360                 }
11361             });
11362         });
11363     }
11364
11365     
// Animate
11366     el.animate( el.to, {
11367         queue:
false,
11368         duration: o.duration,
11369         easing: o.easing,
11370         complete: function() {
11371             
if ( el.to.opacity === 0 ) {
11372                 el.css(
"opacity", el.from.opacity );
11373             }
11374             
if ( mode === "hide" ) {
11375                 el.hide();
11376             }
11377             $.effects.restore( el, props );
11378             
if ( !restore ) {
11379
11380                 
// we need to calculate our new positioning based on the scaling
11381                 
if ( position === "static" ) {
11382                     el.css({
11383                         position:
"relative",
11384                         top: el.to.top,
11385                         left: el.to.left
11386                     });
11387                 }
else {
11388                     $.each([
"top", "left" ], function( idx, pos ) {
11389                         el.css( pos, function( _, str ) {
11390                             
var val = parseInt( str, 10 ),
11391                                 toRef = idx ? el.to.left : el.to.top;
11392
11393                             
// if original was "auto", recalculate the new value from wrapper
11394                             
if ( str === "auto" ) {
11395                                 
return toRef + "px";
11396                             }
11397
11398                             
return val + toRef + "px";
11399                         });
11400                     });
11401                 }
11402             }
11403
11404             $.effects.removeWrapper( el );
11405             done();
11406         }
11407     });
11408
11409 };

11410
11411
11412 /*!
11413  * jQuery UI Effects Scale
1.11.4
11414  * http://jqueryui.com
11415  *
11416  * Copyright jQuery Foundation and other contributors
11417  * Released under the MIT license.
11418  * http://jquery.org/license
11419  *
11420  * http://api.jqueryui.com/scale-effect/
11421  */

11422
11423
11424 var
effectScale = $.effects.effect.scale = function( o, done ) {
11425
11426     
// Create element
11427     
var el = $( this ),
11428         options = $.extend(
true, {}, o ),
11429         mode = $.effects.setMode( el, o.mode ||
"effect" ),
11430         percent = parseInt( o.percent,
10 ) ||
11431             ( parseInt( o.percent,
10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
11432         direction = o.direction ||
"both",
11433         origin = o.origin,
11434         original = {
11435             height: el.height(),
11436             width: el.width(),
11437             outerHeight: el.outerHeight(),
11438             outerWidth: el.outerWidth()
11439         },
11440         factor = {
11441             y: direction !==
"horizontal" ? (percent / 100) : 1,
11442             x: direction !==
"vertical" ? (percent / 100) : 1
11443         };
11444
11445     
// We are going to pass this effect to the size effect:
11446     options.effect =
"size";
11447     options.queue =
false;
11448     options.complete = done;
11449
11450     
// Set default origin and restore for show/hide
11451     
if ( mode !== "effect" ) {
11452         options.origin = origin || [
"middle", "center" ];
11453         options.restore =
true;
11454     }
11455
11456     options.
from = o.from || ( mode === "show" ? {
11457         height:
0,
11458         width:
0,
11459         outerHeight:
0,
11460         outerWidth:
0
11461     } : original );
11462     options.to = {
11463         height: original.height * factor.y,
11464         width: original.width * factor.x,
11465         outerHeight: original.outerHeight * factor.y,
11466         outerWidth: original.outerWidth * factor.x
11467     };
11468
11469     
// Fade option to support puff
11470     
if ( options.fade ) {
11471         
if ( mode === "show" ) {
11472             options.
from.opacity = 0;
11473             options.to.opacity =
1;
11474         }
11475         
if ( mode === "hide" ) {
11476             options.
from.opacity = 1;
11477             options.to.opacity =
0;
11478         }
11479     }
11480
11481     
// Animate
11482     el.effect( options );
11483
11484 };

11485
11486
11487 /*!
11488  * jQuery UI Effects Puff
1.11.4
11489  * http://jqueryui.com
11490  *
11491  * Copyright jQuery Foundation and other contributors
11492  * Released under the MIT license.
11493  * http://jquery.org/license
11494  *
11495  * http://api.jqueryui.com/puff-effect/
11496  */

11497
11498
11499 var
effectPuff = $.effects.effect.puff = function( o, done ) {
11500     
var elem = $( this ),
11501         mode = $.effects.setMode( elem, o.mode ||
"hide" ),
11502         hide = mode ===
"hide",
11503         percent = parseInt( o.percent,
10 ) || 150,
11504         factor = percent /
100,
11505         original = {
11506             height: elem.height(),
11507             width: elem.width(),
11508             outerHeight: elem.outerHeight(),
11509             outerWidth: elem.outerWidth()
11510         };
11511
11512     $.extend( o, {
11513         effect:
"scale",
11514         queue:
false,
11515         fade:
true,
11516         mode: mode,
11517         complete: done,
11518         percent: hide ? percent :
100,
11519         
from: hide ?
11520             original :
11521             {
11522                 height: original.height * factor,
11523                 width: original.width * factor,
11524                 outerHeight: original.outerHeight * factor,
11525                 outerWidth: original.outerWidth * factor
11526             }
11527     });
11528
11529     elem.effect( o );
11530 };

11531
11532
11533 /*!
11534  * jQuery UI Effects Pulsate
1.11.4
11535  * http://jqueryui.com
11536  *
11537  * Copyright jQuery Foundation and other contributors
11538  * Released under the MIT license.
11539  * http://jquery.org/license
11540  *
11541  * http://api.jqueryui.com/pulsate-effect/
11542  */

11543
11544
11545 var
effectPulsate = $.effects.effect.pulsate = function( o, done ) {
11546     
var elem = $( this ),
11547         mode = $.effects.setMode( elem, o.mode ||
"show" ),
11548         show = mode ===
"show",
11549         hide = mode ===
"hide",
11550         showhide = ( show || mode ===
"hide" ),
11551
11552         
// showing or hiding leaves of the "last" animation
11553         anims = ( ( o.times ||
5 ) * 2 ) + ( showhide ? 1 : 0 ),
11554         duration = o.duration / anims,
11555         animateTo =
0,
11556         queue = elem.queue(),
11557         queuelen = queue.length,
11558         i;
11559
11560     
if ( show || !elem.is(":visible")) {
11561         elem.css(
"opacity", 0 ).show();
11562         animateTo =
1;
11563     }
11564
11565     
// anims - 1 opacity "toggles"
11566     
for ( i = 1; i < anims; i++ ) {
11567         elem.animate({
11568             opacity: animateTo
11569         }, duration, o.easing );
11570         animateTo =
1 - animateTo;
11571     }
11572
11573     elem.animate({
11574         opacity: animateTo
11575     }, duration, o.easing);
11576
11577     elem.queue(function() {
11578         
if ( hide ) {
11579             elem.hide();
11580         }
11581         done();
11582     });
11583
11584     
// We just queued up "anims" animations, we need to put them next in the queue
11585     
if ( queuelen > 1 ) {
11586         queue.splice.apply( queue,
11587             [
1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
11588     }
11589     elem.dequeue();
11590 };

11591
11592
11593 /*!
11594  * jQuery UI Effects Shake
1.11.4
11595  * http://jqueryui.com
11596  *
11597  * Copyright jQuery Foundation and other contributors
11598  * Released under the MIT license.
11599  * http://jquery.org/license
11600  *
11601  * http://api.jqueryui.com/shake-effect/
11602  */

11603
11604
11605 var
effectShake = $.effects.effect.shake = function( o, done ) {
11606
11607     
var el = $( this ),
11608         props = [
"position", "top", "bottom", "left", "right", "height", "width" ],
11609         mode = $.effects.setMode( el, o.mode ||
"effect" ),
11610         direction = o.direction ||
"left",
11611         distance = o.distance ||
20,
11612         times = o.times ||
3,
11613         anims = times *
2 + 1,
11614         speed = Math.round( o.duration / anims ),
11615         
ref = (direction === "up" || direction === "down") ? "top" : "left",
11616         positiveMotion = (direction ===
"up" || direction === "left"),
11617         animation = {},
11618         animation1 = {},
11619         animation2 = {},
11620         i,
11621
11622         
// we will need to re-assemble the queue to stack our animations in place
11623         queue = el.queue(),
11624         queuelen = queue.length;
11625
11626     $.effects.save( el, props );
11627     el.show();
11628     $.effects.createWrapper( el );
11629
11630     
// Animation
11631     animation[
ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
11632     animation1[
ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
11633     animation2[
ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
11634
11635     
// Animate
11636     el.animate( animation, speed, o.easing );
11637
11638     
// Shakes
11639     
for ( i = 1; i < times; i++ ) {
11640         el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
11641     }
11642     el
11643         .animate( animation1, speed, o.easing )
11644         .animate( animation, speed /
2, o.easing )
11645         .queue(function() {
11646             
if ( mode === "hide" ) {
11647                 el.hide();
11648             }
11649             $.effects.restore( el, props );
11650             $.effects.removeWrapper( el );
11651             done();
11652         });
11653
11654     
// inject all the animations we just queued to be first in line (after "inprogress")
11655     
if ( queuelen > 1) {
11656         queue.splice.apply( queue,
11657             [
1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
11658     }
11659     el.dequeue();
11660
11661 };

11662
11663
11664 /*!
11665  * jQuery UI Effects Slide
1.11.4
11666  * http://jqueryui.com
11667  *
11668  * Copyright jQuery Foundation and other contributors
11669  * Released under the MIT license.
11670  * http://jquery.org/license
11671  *
11672  * http://api.jqueryui.com/slide-effect/
11673  */

11674
11675
11676 var
effectSlide = $.effects.effect.slide = function( o, done ) {
11677
11678     
// Create element
11679     
var el = $( this ),
11680         props = [
"position", "top", "bottom", "left", "right", "width", "height" ],
11681         mode = $.effects.setMode( el, o.mode ||
"show" ),
11682         show = mode ===
"show",
11683         direction = o.direction ||
"left",
11684         
ref = (direction === "up" || direction === "down") ? "top" : "left",
11685         positiveMotion = (direction ===
"up" || direction === "left"),
11686         distance,
11687         animation = {};
11688
11689     
// Adjust
11690     $.effects.save( el, props );
11691     el.show();
11692     distance = o.distance || el[
ref === "top" ? "outerHeight" : "outerWidth" ]( true );
11693
11694     $.effects.createWrapper( el ).css({
11695         overflow:
"hidden"
11696     });
11697
11698     
if ( show ) {
11699         el.css(
ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
11700     }
11701
11702     
// Animation
11703     animation[
ref ] = ( show ?
11704         ( positiveMotion ?
"+=" : "-=") :
11705         ( positiveMotion ?
"-=" : "+=")) +
11706         distance;
11707
11708     
// Animate
11709     el.animate( animation, {
11710         queue:
false,
11711         duration: o.duration,
11712         easing: o.easing,
11713         complete: function() {
11714             
if ( mode === "hide" ) {
11715                 el.hide();
11716             }
11717             $.effects.restore( el, props );
11718             $.effects.removeWrapper( el );
11719             done();
11720         }
11721     });
11722 };

11723
11724
11725 /*!
11726  * jQuery UI Effects Transfer
1.11.4
11727  * http://jqueryui.com
11728  *
11729  * Copyright jQuery Foundation and other contributors
11730  * Released under the MIT license.
11731  * http://jquery.org/license
11732  *
11733  * http://api.jqueryui.com/transfer-effect/
11734  */

11735
11736
11737 var
effectTransfer = $.effects.effect.transfer = function( o, done ) {
11738     
var elem = $( this ),
11739         target = $( o.to ),
11740         targetFixed = target.css(
"position" ) === "fixed",
11741         body = $(
"body"),
11742         fixTop = targetFixed ? body.scrollTop() :
0,
11743         fixLeft = targetFixed ? body.scrollLeft() :
0,
11744         endPosition = target.offset(),
11745         animation = {
11746             top: endPosition.top - fixTop,
11747             left: endPosition.left - fixLeft,
11748             height: target.innerHeight(),
11749             width: target.innerWidth()
11750         },
11751         startPosition = elem.offset(),
11752         transfer = $(
"<div class='ui-effects-transfer'></div>" )
11753             .appendTo( document.body )
11754             .addClass( o.className )
11755             .css({
11756                 top: startPosition.top - fixTop,
11757                 left: startPosition.left - fixLeft,
11758                 height: elem.innerHeight(),
11759                 width: elem.innerWidth(),
11760                 position: targetFixed ?
"fixed" : "absolute"
11761             })
11762             .animate( animation, o.duration, o.easing, function() {
11763                 transfer.
remove();
11764                 done();
11765             });
11766 };

11767
11768
11769 /*!
11770  * jQuery UI Progressbar
1.11.4
11771  * http://jqueryui.com
11772  *
11773  * Copyright jQuery Foundation and other contributors
11774  * Released under the MIT license.
11775  * http://jquery.org/license
11776  *
11777  * http://api.jqueryui.com/progressbar/
11778  */

11779
11780
11781 var
progressbar = $.widget( "ui.progressbar", {
11782     version:
"1.11.4",
11783     options: {
11784         max:
100,
11785         
value: 0,
11786
11787         change:
null,
11788         complete:
null
11789     },
11790
11791     min:
0,
11792
11793     _create: function() {
11794         
// Constrain initial value
11795         
this.oldValue = this.options.value = this._constrainedValue();
11796
11797         
this.element
11798             .addClass(
"ui-progressbar ui-widget ui-widget-content ui-corner-all" )
11799             .attr({
11800                 
// Only set static values, aria-valuenow and aria-valuemax are
11801                 
// set inside _refreshValue()
11802                 role:
"progressbar",
11803                 
"aria-valuemin": this.min
11804             });
11805
11806         
this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
11807             .appendTo(
this.element );
11808
11809         
this._refreshValue();
11810     },
11811
11812     _destroy: function() {
11813         
this.element
11814             .removeClass(
"ui-progressbar ui-widget ui-widget-content ui-corner-all" )
11815             .removeAttr(
"role" )
11816             .removeAttr(
"aria-valuemin" )
11817             .removeAttr(
"aria-valuemax" )
11818             .removeAttr(
"aria-valuenow" );
11819
11820         
this.valueDiv.remove();
11821     },
11822
11823     
value: function( newValue ) {
11824         
if ( newValue === undefined ) {
11825             
return this.options.value;
11826         }
11827
11828         
this.options.value = this._constrainedValue( newValue );
11829         
this._refreshValue();
11830     },
11831
11832     _constrainedValue: function( newValue ) {
11833         
if ( newValue === undefined ) {
11834             newValue =
this.options.value;
11835         }
11836
11837         
this.indeterminate = newValue === false;
11838
11839         
// sanitize value
11840         
if ( typeof newValue !== "number" ) {
11841             newValue =
0;
11842         }
11843
11844         
return this.indeterminate ? false :
11845             Math.min(
this.options.max, Math.max( this.min, newValue ) );
11846     },
11847
11848     _setOptions: function( options ) {
11849         
// Ensure "value" option is set after other values (like max)
11850         
var value = options.value;
11851         delete options.
value;
11852
11853         
this._super( options );
11854
11855         
this.options.value = this._constrainedValue( value );
11856         
this._refreshValue();
11857     },
11858
11859     _setOption: function( key,
value ) {
11860         
if ( key === "max" ) {
11861             
// Don't allow a max less than min
11862             
value = Math.max( this.min, value );
11863         }
11864         
if ( key === "disabled" ) {
11865             
this.element
11866                 .toggleClass(
"ui-state-disabled", !!value )
11867                 .attr(
"aria-disabled", value );
11868         }
11869         
this._super( key, value );
11870     },
11871
11872     _percentage: function() {
11873         
return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
11874     },
11875
11876     _refreshValue: function() {
11877         
var value = this.options.value,
11878             percentage =
this._percentage();
11879
11880         
this.valueDiv
11881             .toggle(
this.indeterminate || value > this.min )
11882             .toggleClass(
"ui-corner-right", value === this.options.max )
11883             .width( percentage.toFixed(
0) + "%" );
11884
11885         
this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
11886
11887         
if ( this.indeterminate ) {
11888             
this.element.removeAttr( "aria-valuenow" );
11889             
if ( !this.overlayDiv ) {
11890                 
this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
11891             }
11892         }
else {
11893             
this.element.attr({
11894                 
"aria-valuemax": this.options.max,
11895                 
"aria-valuenow": value
11896             });
11897             
if ( this.overlayDiv ) {
11898                 
this.overlayDiv.remove();
11899                 
this.overlayDiv = null;
11900             }
11901         }
11902
11903         
if ( this.oldValue !== value ) {
11904             
this.oldValue = value;
11905             
this._trigger( "change" );
11906         }
11907         
if ( value === this.options.max ) {
11908             
this._trigger( "complete" );
11909         }
11910     }
11911 });

11912
11913
11914 /*!
11915  * jQuery UI Selectable
1.11.4
11916  * http://jqueryui.com
11917  *
11918  * Copyright jQuery Foundation and other contributors
11919  * Released under the MIT license.
11920  * http://jquery.org/license
11921  *
11922  * http://api.jqueryui.com/selectable/
11923  */

11924
11925
11926 var
selectable = $.widget("ui.selectable", $.ui.mouse, {
11927     version:
"1.11.4",
11928     options: {
11929         appendTo:
"body",
11930         autoRefresh:
true,
11931         distance:
0,
11932         filter:
"*",
11933         tolerance:
"touch",
11934
11935         
// callbacks
11936         selected:
null,
11937         selecting:
null,
11938         start:
null,
11939         stop:
null,
11940         unselected:
null,
11941         unselecting:
null
11942     },
11943     _create: function() {
11944         
var selectees,
11945             that =
this;
11946
11947         
this.element.addClass("ui-selectable");
11948
11949         
this.dragged = false;
11950
11951         
// cache selectee children based on filter
11952         
this.refresh = function() {
11953             selectees = $(that.options.filter, that.element[
0]);
11954             selectees.addClass(
"ui-selectee");
11955             selectees.each(function() {
11956                 
var $this = $(this),
11957                     pos = $
this.offset();
11958                 $.data(
this, "selectable-item", {
11959                     element:
this,
11960                     $element: $
this,
11961                     left: pos.left,
11962                     top: pos.top,
11963                     right: pos.left + $
this.outerWidth(),
11964                     bottom: pos.top + $
this.outerHeight(),
11965                     startselected:
false,
11966                     selected: $
this.hasClass("ui-selected"),
11967                     selecting: $
this.hasClass("ui-selecting"),
11968                     unselecting: $
this.hasClass("ui-unselecting")
11969                 });
11970             });
11971         };
11972         
this.refresh();
11973
11974         
this.selectees = selectees.addClass("ui-selectee");
11975
11976         
this._mouseInit();
11977
11978         
this.helper = $("<div class='ui-selectable-helper'></div>");
11979     },
11980
11981     _destroy: function() {
11982         
this.selectees
11983             .removeClass(
"ui-selectee")
11984             .removeData(
"selectable-item");
11985         
this.element
11986             .removeClass(
"ui-selectable ui-selectable-disabled");
11987         
this._mouseDestroy();
11988     },
11989
11990     _mouseStart: function(
event) {
11991         
var that = this,
11992             options =
this.options;
11993
11994         
this.opos = [ event.pageX, event.pageY ];
11995
11996         
if (this.options.disabled) {
11997             
return;
11998         }
11999
12000         
this.selectees = $(options.filter, this.element[0]);
12001
12002         
this._trigger("start", event);
12003
12004         $(options.appendTo).append(
this.helper);
12005         
// position helper (lasso)
12006         
this.helper.css({
12007             
"left": event.pageX,
12008             
"top": event.pageY,
12009             
"width": 0,
12010             
"height": 0
12011         });
12012
12013         
if (options.autoRefresh) {
12014             
this.refresh();
12015         }
12016
12017         
this.selectees.filter(".ui-selected").each(function() {
12018             
var selectee = $.data(this, "selectable-item");
12019             selectee.startselected =
true;
12020             
if (!event.metaKey && !event.ctrlKey) {
12021                 selectee.$element.removeClass(
"ui-selected");
12022                 selectee.selected =
false;
12023                 selectee.$element.addClass(
"ui-unselecting");
12024                 selectee.unselecting =
true;
12025                 
// selectable UNSELECTING callback
12026                 that._trigger(
"unselecting", event, {
12027                     unselecting: selectee.element
12028                 });
12029             }
12030         });
12031
12032         $(
event.target).parents().addBack().each(function() {
12033             
var doSelect,
12034                 selectee = $.data(
this, "selectable-item");
12035             
if (selectee) {
12036                 doSelect = (!
event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
12037                 selectee.$element
12038                     .removeClass(doSelect ?
"ui-unselecting" : "ui-selected")
12039                     .addClass(doSelect ?
"ui-selecting" : "ui-unselecting");
12040                 selectee.unselecting = !doSelect;
12041                 selectee.selecting = doSelect;
12042                 selectee.selected = doSelect;
12043                 
// selectable (UN)SELECTING callback
12044                 
if (doSelect) {
12045                     that._trigger(
"selecting", event, {
12046                         selecting: selectee.element
12047                     });
12048                 }
else {
12049                     that._trigger(
"unselecting", event, {
12050                         unselecting: selectee.element
12051                     });
12052                 }
12053                 
return false;
12054             }
12055         });
12056
12057     },
12058
12059     _mouseDrag: function(
event) {
12060
12061         
this.dragged = true;
12062
12063         
if (this.options.disabled) {
12064             
return;
12065         }
12066
12067         
var tmp,
12068             that =
this,
12069             options =
this.options,
12070             x1 =
this.opos[0],
12071             y1 =
this.opos[1],
12072             x2 =
event.pageX,
12073             y2 =
event.pageY;
12074
12075         
if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
12076         
if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
12077         
this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
12078
12079         
this.selectees.each(function() {
12080             
var selectee = $.data(this, "selectable-item"),
12081                 hit =
false;
12082
12083             
//prevent helper from being selected if appendTo: selectable
12084             
if (!selectee || selectee.element === that.element[0]) {
12085                 
return;
12086             }
12087
12088             
if (options.tolerance === "touch") {
12089                 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
12090             }
else if (options.tolerance === "fit") {
12091                 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
12092             }
12093
12094             
if (hit) {
12095                 
// SELECT
12096                 
if (selectee.selected) {
12097                     selectee.$element.removeClass(
"ui-selected");
12098                     selectee.selected =
false;
12099                 }
12100                 
if (selectee.unselecting) {
12101                     selectee.$element.removeClass(
"ui-unselecting");
12102                     selectee.unselecting =
false;
12103                 }
12104                 
if (!selectee.selecting) {
12105                     selectee.$element.addClass(
"ui-selecting");
12106                     selectee.selecting =
true;
12107                     
// selectable SELECTING callback
12108                     that._trigger(
"selecting", event, {
12109                         selecting: selectee.element
12110                     });
12111                 }
12112             }
else {
12113                 
// UNSELECT
12114                 
if (selectee.selecting) {
12115                     
if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
12116                         selectee.$element.removeClass(
"ui-selecting");
12117                         selectee.selecting =
false;
12118                         selectee.$element.addClass(
"ui-selected");
12119                         selectee.selected =
true;
12120                     }
else {
12121                         selectee.$element.removeClass(
"ui-selecting");
12122                         selectee.selecting =
false;
12123                         
if (selectee.startselected) {
12124                             selectee.$element.addClass(
"ui-unselecting");
12125                             selectee.unselecting =
true;
12126                         }
12127                         
// selectable UNSELECTING callback
12128                         that._trigger(
"unselecting", event, {
12129                             unselecting: selectee.element
12130                         });
12131                     }
12132                 }
12133                 
if (selectee.selected) {
12134                     
if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
12135                         selectee.$element.removeClass(
"ui-selected");
12136                         selectee.selected =
false;
12137
12138                         selectee.$element.addClass(
"ui-unselecting");
12139                         selectee.unselecting =
true;
12140                         
// selectable UNSELECTING callback
12141                         that._trigger(
"unselecting", event, {
12142                             unselecting: selectee.element
12143                         });
12144                     }
12145                 }
12146             }
12147         });
12148
12149         
return false;
12150     },
12151
12152     _mouseStop: function(
event) {
12153         
var that = this;
12154
12155         
this.dragged = false;
12156
12157         $(
".ui-unselecting", this.element[0]).each(function() {
12158             
var selectee = $.data(this, "selectable-item");
12159             selectee.$element.removeClass(
"ui-unselecting");
12160             selectee.unselecting =
false;
12161             selectee.startselected =
false;
12162             that._trigger(
"unselected", event, {
12163                 unselected: selectee.element
12164             });
12165         });
12166         $(
".ui-selecting", this.element[0]).each(function() {
12167             
var selectee = $.data(this, "selectable-item");
12168             selectee.$element.removeClass(
"ui-selecting").addClass("ui-selected");
12169             selectee.selecting =
false;
12170             selectee.selected =
true;
12171             selectee.startselected =
true;
12172             that._trigger(
"selected", event, {
12173                 selected: selectee.element
12174             });
12175         });
12176         
this._trigger("stop", event);
12177
12178         
this.helper.remove();
12179
12180         
return false;
12181     }
12182
12183 });

12184
12185
12186 /*!
12187  * jQuery UI Selectmenu
1.11.4
12188  * http://jqueryui.com
12189  *
12190  * Copyright jQuery Foundation and other contributors
12191  * Released under the MIT license.
12192  * http://jquery.org/license
12193  *
12194  * http://api.jqueryui.com/selectmenu
12195  */

12196
12197
12198 var
selectmenu = $.widget( "ui.selectmenu", {
12199     version:
"1.11.4",
12200     defaultElement:
"<select>",
12201     options: {
12202         appendTo:
null,
12203         disabled:
null,
12204         icons: {
12205             button:
"ui-icon-triangle-1-s"
12206         },
12207         position: {
12208             my:
"left top",
12209             at:
"left bottom",
12210             collision:
"none"
12211         },
12212         width:
null,
12213
12214         
// callbacks
12215         change:
null,
12216         close:
null,
12217         focus:
null,
12218         open:
null,
12219         
select: null
12220     },
12221
12222     _create: function() {
12223         
var selectmenuId = this.element.uniqueId().attr( "id" );
12224         
this.ids = {
12225             element: selectmenuId,
12226             button: selectmenuId +
"-button",
12227             menu: selectmenuId +
"-menu"
12228         };
12229
12230         
this._drawButton();
12231         
this._drawMenu();
12232
12233         
if ( this.options.disabled ) {
12234             
this.disable();
12235         }
12236     },
12237
12238     _drawButton: function() {
12239         
var that = this;
12240
12241         
// Associate existing label with the new button
12242         
this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
12243         
this._on( this.label, {
12244             click: function(
event ) {
12245                 
this.button.focus();
12246                 
event.preventDefault();
12247             }
12248         });
12249
12250         
// Hide original select element
12251         
this.element.hide();
12252
12253         
// Create button
12254         
this.button = $( "<span>", {
12255             
"class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
12256             tabindex:
this.options.disabled ? -1 : 0,
12257             id:
this.ids.button,
12258             role:
"combobox",
12259             
"aria-expanded": "false",
12260             
"aria-autocomplete": "list",
12261             
"aria-owns": this.ids.menu,
12262             
"aria-haspopup": "true"
12263         })
12264             .insertAfter(
this.element );
12265
12266         $(
"<span>", {
12267             
"class": "ui-icon " + this.options.icons.button
12268         })
12269             .prependTo(
this.button );
12270
12271         
this.buttonText = $( "<span>", {
12272             
"class": "ui-selectmenu-text"
12273         })
12274             .appendTo(
this.button );
12275
12276         
this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
12277         
this._resizeButton();
12278
12279         
this._on( this.button, this._buttonEvents );
12280         
this.button.one( "focusin", function() {
12281
12282             
// Delay rendering the menu items until the button receives focus.
12283             
// The menu may have already been rendered via a programmatic open.
12284             
if ( !that.menuItems ) {
12285                 that._refreshMenu();
12286             }
12287         });
12288         
this._hoverable( this.button );
12289         
this._focusable( this.button );
12290     },
12291
12292     _drawMenu: function() {
12293         
var that = this;
12294
12295         
// Create menu
12296         
this.menu = $( "<ul>", {
12297             
"aria-hidden": "true",
12298             
"aria-labelledby": this.ids.button,
12299             id:
this.ids.menu
12300         });
12301
12302         
// Wrap menu
12303         
this.menuWrap = $( "<div>", {
12304             
"class": "ui-selectmenu-menu ui-front"
12305         })
12306             .append(
this.menu )
12307             .appendTo(
this._appendTo() );
12308
12309         
// Initialize menu widget
12310         
this.menuInstance = this.menu
12311             .menu({
12312                 role:
"listbox",
12313                 
select: function( event, ui ) {
12314                     
event.preventDefault();
12315
12316                     
// support: IE8
12317                     
// If the item was selected via a click, the text selection
12318                     
// will be destroyed in IE
12319                     that._setSelection();
12320
12321                     that._select( ui.item.data(
"ui-selectmenu-item" ), event );
12322                 },
12323                 focus: function(
event, ui ) {
12324                     
var item = ui.item.data( "ui-selectmenu-item" );
12325
12326                     
// Prevent inital focus from firing and check if its a newly focused item
12327                     
if ( that.focusIndex != null && item.index !== that.focusIndex ) {
12328                         that._trigger(
"focus", event, { item: item } );
12329                         
if ( !that.isOpen ) {
12330                             that._select( item,
event );
12331                         }
12332                     }
12333                     that.focusIndex = item.index;
12334
12335                     that.button.attr(
"aria-activedescendant",
12336                         that.menuItems.eq( item.index ).attr(
"id" ) );
12337                 }
12338             })
12339             .menu(
"instance" );
12340
12341         
// Adjust menu styles to dropdown
12342         
this.menu
12343             .addClass(
"ui-corner-bottom" )
12344             .removeClass(
"ui-corner-all" );
12345
12346         
// Don't close the menu on mouseleave
12347         
this.menuInstance._off( this.menu, "mouseleave" );
12348
12349         
// Cancel the menu's collapseAll on document click
12350         
this.menuInstance._closeOnDocumentClick = function() {
12351             
return false;
12352         };
12353
12354         
// Selects often contain empty items, but never contain dividers
12355         
this.menuInstance._isDivider = function() {
12356             
return false;
12357         };
12358     },
12359
12360     refresh: function() {
12361         
this._refreshMenu();
12362         
this._setText( this.buttonText, this._getSelectedItem().text() );
12363         
if ( !this.options.width ) {
12364             
this._resizeButton();
12365         }
12366     },
12367
12368     _refreshMenu: function() {
12369         
this.menu.empty();
12370
12371         
var item,
12372             options =
this.element.find( "option" );
12373
12374         
if ( !options.length ) {
12375             
return;
12376         }
12377
12378         
this._parseOptions( options );
12379         
this._renderMenu( this.menu, this.items );
12380
12381         
this.menuInstance.refresh();
12382         
this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" );
12383
12384         item =
this._getSelectedItem();
12385
12386         
// Update the menu to have the correct item focused
12387         
this.menuInstance.focus( null, item );
12388         
this._setAria( item.data( "ui-selectmenu-item" ) );
12389
12390         
// Set disabled state
12391         
this._setOption( "disabled", this.element.prop( "disabled" ) );
12392     },
12393
12394     open: function(
event ) {
12395         
if ( this.options.disabled ) {
12396             
return;
12397         }
12398
12399         
// If this is the first time the menu is being opened, render the items
12400         
if ( !this.menuItems ) {
12401             
this._refreshMenu();
12402         }
else {
12403
12404             
// Menu clears focus on close, reset focus to selected item
12405             
this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" );
12406             
this.menuInstance.focus( null, this._getSelectedItem() );
12407         }
12408
12409         
this.isOpen = true;
12410         
this._toggleAttr();
12411         
this._resizeMenu();
12412         
this._position();
12413
12414         
this._on( this.document, this._documentClick );
12415
12416         
this._trigger( "open", event );
12417     },
12418
12419     _position: function() {
12420         
this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
12421     },
12422
12423     close: function(
event ) {
12424         
if ( !this.isOpen ) {
12425             
return;
12426         }
12427
12428         
this.isOpen = false;
12429         
this._toggleAttr();
12430
12431         
this.range = null;
12432         
this._off( this.document );
12433
12434         
this._trigger( "close", event );
12435     },
12436
12437     widget: function() {
12438         
return this.button;
12439     },
12440
12441     menuWidget: function() {
12442         
return this.menu;
12443     },
12444
12445     _renderMenu: function( ul, items ) {
12446         
var that = this,
12447             currentOptgroup =
"";
12448
12449         $.each( items, function( index, item ) {
12450             
if ( item.optgroup !== currentOptgroup ) {
12451                 $(
"<li>", {
12452                     
"class": "ui-selectmenu-optgroup ui-menu-divider" +
12453                         ( item.element.parent(
"optgroup" ).prop( "disabled" ) ?
12454                             
" ui-state-disabled" :
12455                             
"" ),
12456                     text: item.optgroup
12457                 })
12458                     .appendTo( ul );
12459
12460                 currentOptgroup = item.optgroup;
12461             }
12462
12463             that._renderItemData( ul, item );
12464         });
12465     },
12466
12467     _renderItemData: function( ul, item ) {
12468         
return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
12469     },
12470
12471     _renderItem: function( ul, item ) {
12472         
var li = $( "<li>" );
12473
12474         
if ( item.disabled ) {
12475             li.addClass(
"ui-state-disabled" );
12476         }
12477         
this._setText( li, item.label );
12478
12479         
return li.appendTo( ul );
12480     },
12481
12482     _setText: function( element,
value ) {
12483         
if ( value ) {
12484             element.text(
value );
12485         }
else {
12486             element.html(
"&#160;" );
12487         }
12488     },
12489
12490     _move: function( direction,
event ) {
12491         
var item, next,
12492             filter =
".ui-menu-item";
12493
12494         
if ( this.isOpen ) {
12495             item =
this.menuItems.eq( this.focusIndex );
12496         }
else {
12497             item =
this.menuItems.eq( this.element[ 0 ].selectedIndex );
12498             filter +=
":not(.ui-state-disabled)";
12499         }
12500
12501         
if ( direction === "first" || direction === "last" ) {
12502             next = item[ direction ===
"first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
12503         }
else {
12504             next = item[ direction +
"All" ]( filter ).eq( 0 );
12505         }
12506
12507         
if ( next.length ) {
12508             
this.menuInstance.focus( event, next );
12509         }
12510     },
12511
12512     _getSelectedItem: function() {
12513         
return this.menuItems.eq( this.element[ 0 ].selectedIndex );
12514     },
12515
12516     _toggle: function(
event ) {
12517         
this[ this.isOpen ? "close" : "open" ]( event );
12518     },
12519
12520     _setSelection: function() {
12521         
var selection;
12522
12523         
if ( !this.range ) {
12524             
return;
12525         }
12526
12527         
if ( window.getSelection ) {
12528             selection = window.getSelection();
12529             selection.removeAllRanges();
12530             selection.addRange(
this.range );
12531
12532         
// support: IE8
12533         }
else {
12534             
this.range.select();
12535         }
12536
12537         
// support: IE
12538         
// Setting the text selection kills the button focus in IE, but
12539         
// restoring the focus doesn't kill the selection.
12540         
this.button.focus();
12541     },
12542
12543     _documentClick: {
12544         mousedown: function(
event ) {
12545             
if ( !this.isOpen ) {
12546                 
return;
12547             }
12548
12549             
if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) {
12550                 
this.close( event );
12551             }
12552         }
12553     },
12554
12555     _buttonEvents: {
12556
12557         
// Prevent text selection from being reset when interacting with the selectmenu (#10144)
12558         mousedown: function() {
12559             
var selection;
12560
12561             
if ( window.getSelection ) {
12562                 selection = window.getSelection();
12563                 
if ( selection.rangeCount ) {
12564                     
this.range = selection.getRangeAt( 0 );
12565                 }
12566
12567             
// support: IE8
12568             }
else {
12569                 
this.range = document.selection.createRange();
12570             }
12571         },
12572
12573         click: function(
event ) {
12574             
this._setSelection();
12575             
this._toggle( event );
12576         },
12577
12578         keydown: function(
event ) {
12579             
var preventDefault = true;
12580             
switch ( event.keyCode ) {
12581                 
case $.ui.keyCode.TAB:
12582                 
case $.ui.keyCode.ESCAPE:
12583                     
this.close( event );
12584                     preventDefault =
false;
12585                     
break;
12586                 
case $.ui.keyCode.ENTER:
12587                     
if ( this.isOpen ) {
12588                         
this._selectFocusedItem( event );
12589                     }
12590                     
break;
12591                 
case $.ui.keyCode.UP:
12592                     
if ( event.altKey ) {
12593                         
this._toggle( event );
12594                     }
else {
12595                         
this._move( "prev", event );
12596                     }
12597                     
break;
12598                 
case $.ui.keyCode.DOWN:
12599                     
if ( event.altKey ) {
12600                         
this._toggle( event );
12601                     }
else {
12602                         
this._move( "next", event );
12603                     }
12604                     
break;
12605                 
case $.ui.keyCode.SPACE:
12606                     
if ( this.isOpen ) {
12607                         
this._selectFocusedItem( event );
12608                     }
else {
12609                         
this._toggle( event );
12610                     }
12611                     
break;
12612                 
case $.ui.keyCode.LEFT:
12613                     
this._move( "prev", event );
12614                     
break;
12615                 
case $.ui.keyCode.RIGHT:
12616                     
this._move( "next", event );
12617                     
break;
12618                 
case $.ui.keyCode.HOME:
12619                 
case $.ui.keyCode.PAGE_UP:
12620                     
this._move( "first", event );
12621                     
break;
12622                 
case $.ui.keyCode.END:
12623                 
case $.ui.keyCode.PAGE_DOWN:
12624                     
this._move( "last", event );
12625                     
break;
12626                 
default:
12627                     
this.menu.trigger( event );
12628                     preventDefault =
false;
12629             }
12630
12631             
if ( preventDefault ) {
12632                 
event.preventDefault();
12633             }
12634         }
12635     },
12636
12637     _selectFocusedItem: function(
event ) {
12638         
var item = this.menuItems.eq( this.focusIndex );
12639         
if ( !item.hasClass( "ui-state-disabled" ) ) {
12640             
this._select( item.data( "ui-selectmenu-item" ), event );
12641         }
12642     },
12643
12644     _select: function( item,
event ) {
12645         
var oldIndex = this.element[ 0 ].selectedIndex;
12646
12647         
// Change native select element
12648         
this.element[ 0 ].selectedIndex = item.index;
12649         
this._setText( this.buttonText, item.label );
12650         
this._setAria( item );
12651         
this._trigger( "select", event, { item: item } );
12652
12653         
if ( item.index !== oldIndex ) {
12654             
this._trigger( "change", event, { item: item } );
12655         }
12656
12657         
this.close( event );
12658     },
12659
12660     _setAria: function( item ) {
12661         
var id = this.menuItems.eq( item.index ).attr( "id" );
12662
12663         
this.button.attr({
12664             
"aria-labelledby": id,
12665             
"aria-activedescendant": id
12666         });
12667         
this.menu.attr( "aria-activedescendant", id );
12668     },
12669
12670     _setOption: function( key,
value ) {
12671         
if ( key === "icons" ) {
12672             
this.button.find( "span.ui-icon" )
12673                 .removeClass(
this.options.icons.button )
12674                 .addClass(
value.button );
12675         }
12676
12677         
this._super( key, value );
12678
12679         
if ( key === "appendTo" ) {
12680             
this.menuWrap.appendTo( this._appendTo() );
12681         }
12682
12683         
if ( key === "disabled" ) {
12684             
this.menuInstance.option( "disabled", value );
12685             
this.button
12686                 .toggleClass(
"ui-state-disabled", value )
12687                 .attr(
"aria-disabled", value );
12688
12689             
this.element.prop( "disabled", value );
12690             
if ( value ) {
12691                 
this.button.attr( "tabindex", -1 );
12692                 
this.close();
12693             }
else {
12694                 
this.button.attr( "tabindex", 0 );
12695             }
12696         }
12697
12698         
if ( key === "width" ) {
12699             
this._resizeButton();
12700         }
12701     },
12702
12703     _appendTo: function() {
12704         
var element = this.options.appendTo;
12705
12706         
if ( element ) {
12707             element = element.jquery || element.nodeType ?
12708                 $( element ) :
12709                 
this.document.find( element ).eq( 0 );
12710         }
12711
12712         
if ( !element || !element[ 0 ] ) {
12713             element =
this.element.closest( ".ui-front" );
12714         }
12715
12716         
if ( !element.length ) {
12717             element =
this.document[ 0 ].body;
12718         }
12719
12720         
return element;
12721     },
12722
12723     _toggleAttr: function() {
12724         
this.button
12725             .toggleClass(
"ui-corner-top", this.isOpen )
12726             .toggleClass(
"ui-corner-all", !this.isOpen )
12727             .attr(
"aria-expanded", this.isOpen );
12728         
this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
12729         
this.menu.attr( "aria-hidden", !this.isOpen );
12730     },
12731
12732     _resizeButton: function() {
12733         
var width = this.options.width;
12734
12735         
if ( !width ) {
12736             width =
this.element.show().outerWidth();
12737             
this.element.hide();
12738         }
12739
12740         
this.button.outerWidth( width );
12741     },
12742
12743     _resizeMenu: function() {
12744         
this.menu.outerWidth( Math.max(
12745             
this.button.outerWidth(),
12746
12747             
// support: IE10
12748             
// IE10 wraps long text (possibly a rounding bug)
12749             
// so we add 1px to avoid the wrapping
12750             
this.menu.width( "" ).outerWidth() + 1
12751         ) );
12752     },
12753
12754     _getCreateOptions: function() {
12755         
return { disabled: this.element.prop( "disabled" ) };
12756     },
12757
12758     _parseOptions: function( options ) {
12759         
var data = [];
12760         options.each(function( index, item ) {
12761             
var option = $( item ),
12762                 optgroup = option.parent(
"optgroup" );
12763             data.push({
12764                 element: option,
12765                 index: index,
12766                 
value: option.val(),
12767                 label: option.text(),
12768                 optgroup: optgroup.attr(
"label" ) || "",
12769                 disabled: optgroup.prop(
"disabled" ) || option.prop( "disabled" )
12770             });
12771         });
12772         
this.items = data;
12773     },
12774
12775     _destroy: function() {
12776         
this.menuWrap.remove();
12777         
this.button.remove();
12778         
this.element.show();
12779         
this.element.removeUniqueId();
12780         
this.label.attr( "for", this.ids.element );
12781     }
12782 });

12783
12784
12785 /*!
12786  * jQuery UI Slider
1.11.4
12787  * http://jqueryui.com
12788  *
12789  * Copyright jQuery Foundation and other contributors
12790  * Released under the MIT license.
12791  * http://jquery.org/license
12792  *
12793  * http://api.jqueryui.com/slider/
12794  */

12795
12796
12797 var
slider = $.widget( "ui.slider", $.ui.mouse, {
12798     version:
"1.11.4",
12799     widgetEventPrefix:
"slide",
12800
12801     options: {
12802         animate:
false,
12803         distance:
0,
12804         max:
100,
12805         min:
0,
12806         orientation:
"horizontal",
12807         range:
false,
12808         step:
1,
12809         
value: 0,
12810         values:
null,
12811
12812         
// callbacks
12813         change:
null,
12814         slide:
null,
12815         start:
null,
12816         stop:
null
12817     },
12818
12819     
// number of pages in a slider
12820     
// (how many times can you page up/down to go through the whole range)
12821     numPages:
5,
12822
12823     _create: function() {
12824         
this._keySliding = false;
12825         
this._mouseSliding = false;
12826         
this._animateOff = true;
12827         
this._handleIndex = null;
12828         
this._detectOrientation();
12829         
this._mouseInit();
12830         
this._calculateNewMax();
12831
12832         
this.element
12833             .addClass(
"ui-slider" +
12834                 
" ui-slider-" + this.orientation +
12835                 
" ui-widget" +
12836                 
" ui-widget-content" +
12837                 
" ui-corner-all");
12838
12839         
this._refresh();
12840         
this._setOption( "disabled", this.options.disabled );
12841
12842         
this._animateOff = false;
12843     },
12844
12845     _refresh: function() {
12846         
this._createRange();
12847         
this._createHandles();
12848         
this._setupEvents();
12849         
this._refreshValue();
12850     },
12851
12852     _createHandles: function() {
12853         
var i, handleCount,
12854             options =
this.options,
12855             existingHandles =
this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
12856             handle =
"<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",
12857             handles = [];
12858
12859         handleCount = ( options.values && options.values.length ) ||
1;
12860
12861         
if ( existingHandles.length > handleCount ) {
12862             existingHandles.slice( handleCount ).
remove();
12863             existingHandles = existingHandles.slice(
0, handleCount );
12864         }
12865
12866         
for ( i = existingHandles.length; i < handleCount; i++ ) {
12867             handles.push( handle );
12868         }
12869
12870         
this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
12871
12872         
this.handle = this.handles.eq( 0 );
12873
12874         
this.handles.each(function( i ) {
12875             $(
this ).data( "ui-slider-handle-index", i );
12876         });
12877     },
12878
12879     _createRange: function() {
12880         
var options = this.options,
12881             classes =
"";
12882
12883         
if ( options.range ) {
12884             
if ( options.range === true ) {
12885                 
if ( !options.values ) {
12886                     options.values = [
this._valueMin(), this._valueMin() ];
12887                 }
else if ( options.values.length && options.values.length !== 2 ) {
12888                     options.values = [ options.values[
0], options.values[0] ];
12889                 }
else if ( $.isArray( options.values ) ) {
12890                     options.values = options.values.slice(
0);
12891                 }
12892             }
12893
12894             
if ( !this.range || !this.range.length ) {
12895                 
this.range = $( "<div></div>" )
12896                     .appendTo(
this.element );
12897
12898                 classes =
"ui-slider-range" +
12899                 
// note: this isn't the most fittingly semantic framework class for this element,
12900                 
// but worked best visually with a variety of themes
12901                 
" ui-widget-header ui-corner-all";
12902             }
else {
12903                 
this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
12904                     
// Handle range switching from true to min/max
12905                     .css({
12906                         
"left": "",
12907                         
"bottom": ""
12908                     });
12909             }
12910
12911             
this.range.addClass( classes +
12912                 ( ( options.range ===
"min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
12913         }
else {
12914             
if ( this.range ) {
12915                 
this.range.remove();
12916             }
12917             
this.range = null;
12918         }
12919     },
12920
12921     _setupEvents: function() {
12922         
this._off( this.handles );
12923         
this._on( this.handles, this._handleEvents );
12924         
this._hoverable( this.handles );
12925         
this._focusable( this.handles );
12926     },
12927
12928     _destroy: function() {
12929         
this.handles.remove();
12930         
if ( this.range ) {
12931             
this.range.remove();
12932         }
12933
12934         
this.element
12935             .removeClass(
"ui-slider" +
12936                 
" ui-slider-horizontal" +
12937                 
" ui-slider-vertical" +
12938                 
" ui-widget" +
12939                 
" ui-widget-content" +
12940                 
" ui-corner-all" );
12941
12942         
this._mouseDestroy();
12943     },
12944
12945     _mouseCapture: function(
event ) {
12946         
var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
12947             that =
this,
12948             o =
this.options;
12949
12950         
if ( o.disabled ) {
12951             
return false;
12952         }
12953
12954         
this.elementSize = {
12955             width:
this.element.outerWidth(),
12956             height:
this.element.outerHeight()
12957         };
12958         
this.elementOffset = this.element.offset();
12959
12960         position = { x:
event.pageX, y: event.pageY };
12961         normValue =
this._normValueFromMouse( position );
12962         distance =
this._valueMax() - this._valueMin() + 1;
12963         
this.handles.each(function( i ) {
12964             
var thisDistance = Math.abs( normValue - that.values(i) );
12965             
if (( distance > thisDistance ) ||
12966                 ( distance === thisDistance &&
12967                     (i === that._lastChangedValue || that.values(i) === o.min ))) {
12968                 distance = thisDistance;
12969                 closestHandle = $(
this );
12970                 index = i;
12971             }
12972         });
12973
12974         allowed =
this._start( event, index );
12975         
if ( allowed === false ) {
12976             
return false;
12977         }
12978         
this._mouseSliding = true;
12979
12980         
this._handleIndex = index;
12981
12982         closestHandle
12983             .addClass(
"ui-state-active" )
12984             .focus();
12985
12986         offset = closestHandle.offset();
12987         mouseOverHandle = !$(
event.target ).parents().addBack().is( ".ui-slider-handle" );
12988         
this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
12989             left:
event.pageX - offset.left - ( closestHandle.width() / 2 ),
12990             top:
event.pageY - offset.top -
12991                 ( closestHandle.height() /
2 ) -
12992                 ( parseInt( closestHandle.css(
"borderTopWidth"), 10 ) || 0 ) -
12993                 ( parseInt( closestHandle.css(
"borderBottomWidth"), 10 ) || 0) +
12994                 ( parseInt( closestHandle.css(
"marginTop"), 10 ) || 0)
12995         };
12996
12997         
if ( !this.handles.hasClass( "ui-state-hover" ) ) {
12998             
this._slide( event, index, normValue );
12999         }
13000         
this._animateOff = true;
13001         
return true;
13002     },
13003
13004     _mouseStart: function() {
13005         
return true;
13006     },
13007
13008     _mouseDrag: function(
event ) {
13009         
var position = { x: event.pageX, y: event.pageY },
13010             normValue =
this._normValueFromMouse( position );
13011
13012         
this._slide( event, this._handleIndex, normValue );
13013
13014         
return false;
13015     },
13016
13017     _mouseStop: function(
event ) {
13018         
this.handles.removeClass( "ui-state-active" );
13019         
this._mouseSliding = false;
13020
13021         
this._stop( event, this._handleIndex );
13022         
this._change( event, this._handleIndex );
13023
13024         
this._handleIndex = null;
13025         
this._clickOffset = null;
13026         
this._animateOff = false;
13027
13028         
return false;
13029     },
13030
13031     _detectOrientation: function() {
13032         
this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
13033     },
13034
13035     _normValueFromMouse: function( position ) {
13036         
var pixelTotal,
13037             pixelMouse,
13038             percentMouse,
13039             valueTotal,
13040             valueMouse;
13041
13042         
if ( this.orientation === "horizontal" ) {
13043             pixelTotal =
this.elementSize.width;
13044             pixelMouse = position.x -
this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
13045         }
else {
13046             pixelTotal =
this.elementSize.height;
13047             pixelMouse = position.y -
this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
13048         }
13049
13050         percentMouse = ( pixelMouse / pixelTotal );
13051         
if ( percentMouse > 1 ) {
13052             percentMouse =
1;
13053         }
13054         
if ( percentMouse < 0 ) {
13055             percentMouse =
0;
13056         }
13057         
if ( this.orientation === "vertical" ) {
13058             percentMouse =
1 - percentMouse;
13059         }
13060
13061         valueTotal =
this._valueMax() - this._valueMin();
13062         valueMouse =
this._valueMin() + percentMouse * valueTotal;
13063
13064         
return this._trimAlignValue( valueMouse );
13065     },
13066
13067     _start: function(
event, index ) {
13068         
var uiHash = {
13069             handle:
this.handles[ index ],
13070             
value: this.value()
13071         };
13072         
if ( this.options.values && this.options.values.length ) {
13073             uiHash.
value = this.values( index );
13074             uiHash.values =
this.values();
13075         }
13076         
return this._trigger( "start", event, uiHash );
13077     },
13078
13079     _slide: function(
event, index, newVal ) {
13080         
var otherVal,
13081             newValues,
13082             allowed;
13083
13084         
if ( this.options.values && this.options.values.length ) {
13085             otherVal =
this.values( index ? 0 : 1 );
13086
13087             
if ( ( this.options.values.length === 2 && this.options.range === true ) &&
13088                     ( ( index ===
0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
13089                 ) {
13090                 newVal = otherVal;
13091             }
13092
13093             
if ( newVal !== this.values( index ) ) {
13094                 newValues =
this.values();
13095                 newValues[ index ] = newVal;
13096                 
// A slide can be canceled by returning false from the slide callback
13097                 allowed =
this._trigger( "slide", event, {
13098                     handle:
this.handles[ index ],
13099                     
value: newVal,
13100                     values: newValues
13101                 } );
13102                 otherVal =
this.values( index ? 0 : 1 );
13103                 
if ( allowed !== false ) {
13104                     
this.values( index, newVal );
13105                 }
13106             }
13107         }
else {
13108             
if ( newVal !== this.value() ) {
13109                 
// A slide can be canceled by returning false from the slide callback
13110                 allowed =
this._trigger( "slide", event, {
13111                     handle:
this.handles[ index ],
13112                     
value: newVal
13113                 } );
13114                 
if ( allowed !== false ) {
13115                     
this.value( newVal );
13116                 }
13117             }
13118         }
13119     },
13120
13121     _stop: function(
event, index ) {
13122         
var uiHash = {
13123             handle:
this.handles[ index ],
13124             
value: this.value()
13125         };
13126         
if ( this.options.values && this.options.values.length ) {
13127             uiHash.
value = this.values( index );
13128             uiHash.values =
this.values();
13129         }
13130
13131         
this._trigger( "stop", event, uiHash );
13132     },
13133
13134     _change: function(
event, index ) {
13135         
if ( !this._keySliding && !this._mouseSliding ) {
13136             
var uiHash = {
13137                 handle:
this.handles[ index ],
13138                 
value: this.value()
13139             };
13140             
if ( this.options.values && this.options.values.length ) {
13141                 uiHash.
value = this.values( index );
13142                 uiHash.values =
this.values();
13143             }
13144
13145             
//store the last changed value index for reference when handles overlap
13146             
this._lastChangedValue = index;
13147
13148             
this._trigger( "change", event, uiHash );
13149         }
13150     },
13151
13152     
value: function( newValue ) {
13153         
if ( arguments.length ) {
13154             
this.options.value = this._trimAlignValue( newValue );
13155             
this._refreshValue();
13156             
this._change( null, 0 );
13157             
return;
13158         }
13159
13160         
return this._value();
13161     },
13162
13163     values: function( index, newValue ) {
13164         
var vals,
13165             newValues,
13166             i;
13167
13168         
if ( arguments.length > 1 ) {
13169             
this.options.values[ index ] = this._trimAlignValue( newValue );
13170             
this._refreshValue();
13171             
this._change( null, index );
13172             
return;
13173         }
13174
13175         
if ( arguments.length ) {
13176             
if ( $.isArray( arguments[ 0 ] ) ) {
13177                 vals =
this.options.values;
13178                 newValues = arguments[
0 ];
13179                 
for ( i = 0; i < vals.length; i += 1 ) {
13180                     vals[ i ] =
this._trimAlignValue( newValues[ i ] );
13181                     
this._change( null, i );
13182                 }
13183                 
this._refreshValue();
13184             }
else {
13185                 
if ( this.options.values && this.options.values.length ) {
13186                     
return this._values( index );
13187                 }
else {
13188                     
return this.value();
13189                 }
13190             }
13191         }
else {
13192             
return this._values();
13193         }
13194     },
13195
13196     _setOption: function( key,
value ) {
13197         
var i,
13198             valsLength =
0;
13199
13200         
if ( key === "range" && this.options.range === true ) {
13201             
if ( value === "min" ) {
13202                 
this.options.value = this._values( 0 );
13203                 
this.options.values = null;
13204             }
else if ( value === "max" ) {
13205                 
this.options.value = this._values( this.options.values.length - 1 );
13206                 
this.options.values = null;
13207             }
13208         }
13209
13210         
if ( $.isArray( this.options.values ) ) {
13211             valsLength =
this.options.values.length;
13212         }
13213
13214         
if ( key === "disabled" ) {
13215             
this.element.toggleClass( "ui-state-disabled", !!value );
13216         }
13217
13218         
this._super( key, value );
13219
13220         
switch ( key ) {
13221             
case "orientation":
13222                 
this._detectOrientation();
13223                 
this.element
13224                     .removeClass(
"ui-slider-horizontal ui-slider-vertical" )
13225                     .addClass(
"ui-slider-" + this.orientation );
13226                 
this._refreshValue();
13227
13228                 
// Reset positioning from previous orientation
13229                 
this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
13230                 
break;
13231             
case "value":
13232                 
this._animateOff = true;
13233                 
this._refreshValue();
13234                 
this._change( null, 0 );
13235                 
this._animateOff = false;
13236                 
break;
13237             
case "values":
13238                 
this._animateOff = true;
13239                 
this._refreshValue();
13240                 
for ( i = 0; i < valsLength; i += 1 ) {
13241                     
this._change( null, i );
13242                 }
13243                 
this._animateOff = false;
13244                 
break;
13245             
case "step":
13246             
case "min":
13247             
case "max":
13248                 
this._animateOff = true;
13249                 
this._calculateNewMax();
13250                 
this._refreshValue();
13251                 
this._animateOff = false;
13252                 
break;
13253             
case "range":
13254                 
this._animateOff = true;
13255                 
this._refresh();
13256                 
this._animateOff = false;
13257                 
break;
13258         }
13259     },
13260
13261     
//internal value getter
13262     
// _value() returns value trimmed by min and max, aligned by step
13263     _value: function() {
13264         
var val = this.options.value;
13265         val =
this._trimAlignValue( val );
13266
13267         
return val;
13268     },
13269
13270     
//internal values getter
13271     
// _values() returns array of values trimmed by min and max, aligned by step
13272     
// _values( index ) returns single value trimmed by min and max, aligned by step
13273     _values: function( index ) {
13274         
var val,
13275             vals,
13276             i;
13277
13278         
if ( arguments.length ) {
13279             val =
this.options.values[ index ];
13280             val =
this._trimAlignValue( val );
13281
13282             
return val;
13283         }
else if ( this.options.values && this.options.values.length ) {
13284             
// .slice() creates a copy of the array
13285             
// this copy gets trimmed by min and max and then returned
13286             vals =
this.options.values.slice();
13287             
for ( i = 0; i < vals.length; i += 1) {
13288                 vals[ i ] =
this._trimAlignValue( vals[ i ] );
13289             }
13290
13291             
return vals;
13292         }
else {
13293             
return [];
13294         }
13295     },
13296
13297     
// returns the step-aligned value that val is closest to, between (inclusive) min and max
13298     _trimAlignValue: function( val ) {
13299         
if ( val <= this._valueMin() ) {
13300             
return this._valueMin();
13301         }
13302         
if ( val >= this._valueMax() ) {
13303             
return this._valueMax();
13304         }
13305         
var step = ( this.options.step > 0 ) ? this.options.step : 1,
13306             valModStep = (val -
this._valueMin()) % step,
13307             alignValue = val - valModStep;
13308
13309         
if ( Math.abs(valModStep) * 2 >= step ) {
13310             alignValue += ( valModStep >
0 ) ? step : ( -step );
13311         }
13312
13313         
// Since JavaScript has problems with large floats, round
13314         
// the final value to 5 digits after the decimal point (see #4124)
13315         
return parseFloat( alignValue.toFixed(5) );
13316     },
13317
13318     _calculateNewMax: function() {
13319         
var max = this.options.max,
13320             min =
this._valueMin(),
13321             step =
this.options.step,
13322             aboveMin = Math.floor( ( +( max - min ).toFixed(
this._precision() ) ) / step ) * step;
13323         max = aboveMin + min;
13324         
this.max = parseFloat( max.toFixed( this._precision() ) );
13325     },
13326
13327     _precision: function() {
13328         
var precision = this._precisionOf( this.options.step );
13329         
if ( this.options.min !== null ) {
13330             precision = Math.max( precision,
this._precisionOf( this.options.min ) );
13331         }
13332         
return precision;
13333     },
13334
13335     _precisionOf: function( num ) {
13336         
var str = num.toString(),
13337             
decimal = str.indexOf( "." );
13338         
return decimal === -1 ? 0 : str.length - decimal - 1;
13339     },
13340
13341     _valueMin: function() {
13342         
return this.options.min;
13343     },
13344
13345     _valueMax: function() {
13346         
return this.max;
13347     },
13348
13349     _refreshValue: function() {
13350         
var lastValPercent, valPercent, value, valueMin, valueMax,
13351             oRange =
this.options.range,
13352             o =
this.options,
13353             that =
this,
13354             animate = ( !
this._animateOff ) ? o.animate : false,
13355             _set = {};
13356
13357         
if ( this.options.values && this.options.values.length ) {
13358             
this.handles.each(function( i ) {
13359                 valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) *
100;
13360                 _set[ that.orientation ===
"horizontal" ? "left" : "bottom" ] = valPercent + "%";
13361                 $(
this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13362                 
if ( that.options.range === true ) {
13363                     
if ( that.orientation === "horizontal" ) {
13364                         
if ( i === 0 ) {
13365                             that.range.stop(
1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
13366                         }
13367                         
if ( i === 1 ) {
13368                             that.range[ animate ?
"animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13369                         }
13370                     }
else {
13371                         
if ( i === 0 ) {
13372                             that.range.stop(
1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
13373                         }
13374                         
if ( i === 1 ) {
13375                             that.range[ animate ?
"animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13376                         }
13377                     }
13378                 }
13379                 lastValPercent = valPercent;
13380             });
13381         }
else {
13382             
value = this.value();
13383             valueMin =
this._valueMin();
13384             valueMax =
this._valueMax();
13385             valPercent = ( valueMax !== valueMin ) ?
13386                     (
value - valueMin ) / ( valueMax - valueMin ) * 100 :
13387                     
0;
13388             _set[
this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13389             
this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13390
13391             
if ( oRange === "min" && this.orientation === "horizontal" ) {
13392                 
this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
13393             }
13394             
if ( oRange === "max" && this.orientation === "horizontal" ) {
13395                 
this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13396             }
13397             
if ( oRange === "min" && this.orientation === "vertical" ) {
13398                 
this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
13399             }
13400             
if ( oRange === "max" && this.orientation === "vertical" ) {
13401                 
this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13402             }
13403         }
13404     },
13405
13406     _handleEvents: {
13407         keydown: function(
event ) {
13408             
var allowed, curVal, newVal, step,
13409                 index = $(
event.target ).data( "ui-slider-handle-index" );
13410
13411             
switch ( event.keyCode ) {
13412                 
case $.ui.keyCode.HOME:
13413                 
case $.ui.keyCode.END:
13414                 
case $.ui.keyCode.PAGE_UP:
13415                 
case $.ui.keyCode.PAGE_DOWN:
13416                 
case $.ui.keyCode.UP:
13417                 
case $.ui.keyCode.RIGHT:
13418                 
case $.ui.keyCode.DOWN:
13419                 
case $.ui.keyCode.LEFT:
13420                     
event.preventDefault();
13421                     
if ( !this._keySliding ) {
13422                         
this._keySliding = true;
13423                         $(
event.target ).addClass( "ui-state-active" );
13424                         allowed =
this._start( event, index );
13425                         
if ( allowed === false ) {
13426                             
return;
13427                         }
13428                     }
13429                     
break;
13430             }
13431
13432             step =
this.options.step;
13433             
if ( this.options.values && this.options.values.length ) {
13434                 curVal = newVal =
this.values( index );
13435             }
else {
13436                 curVal = newVal =
this.value();
13437             }
13438
13439             
switch ( event.keyCode ) {
13440                 
case $.ui.keyCode.HOME:
13441                     newVal =
this._valueMin();
13442                     
break;
13443                 
case $.ui.keyCode.END:
13444                     newVal =
this._valueMax();
13445                     
break;
13446                 
case $.ui.keyCode.PAGE_UP:
13447                     newVal =
this._trimAlignValue(
13448                         curVal + ( (
this._valueMax() - this._valueMin() ) / this.numPages )
13449                     );
13450                     
break;
13451                 
case $.ui.keyCode.PAGE_DOWN:
13452                     newVal =
this._trimAlignValue(
13453                         curVal - ( (
this._valueMax() - this._valueMin()) / this.numPages ) );
13454                     
break;
13455                 
case $.ui.keyCode.UP:
13456                 
case $.ui.keyCode.RIGHT:
13457                     
if ( curVal === this._valueMax() ) {
13458                         
return;
13459                     }
13460                     newVal =
this._trimAlignValue( curVal + step );
13461                     
break;
13462                 
case $.ui.keyCode.DOWN:
13463                 
case $.ui.keyCode.LEFT:
13464                     
if ( curVal === this._valueMin() ) {
13465                         
return;
13466                     }
13467                     newVal =
this._trimAlignValue( curVal - step );
13468                     
break;
13469             }
13470
13471             
this._slide( event, index, newVal );
13472         },
13473         keyup: function(
event ) {
13474             
var index = $( event.target ).data( "ui-slider-handle-index" );
13475
13476             
if ( this._keySliding ) {
13477                 
this._keySliding = false;
13478                 
this._stop( event, index );
13479                 
this._change( event, index );
13480                 $(
event.target ).removeClass( "ui-state-active" );
13481             }
13482         }
13483     }
13484 });

13485
13486
13487 /*!
13488  * jQuery UI Sortable
1.11.4
13489  * http://jqueryui.com
13490  *
13491  * Copyright jQuery Foundation and other contributors
13492  * Released under the MIT license.
13493  * http://jquery.org/license
13494  *
13495  * http://api.jqueryui.com/sortable/
13496  */

13497
13498
13499 var
sortable = $.widget("ui.sortable", $.ui.mouse, {
13500     version:
"1.11.4",
13501     widgetEventPrefix:
"sort",
13502     ready:
false,
13503     options: {
13504         appendTo:
"parent",
13505         axis:
false,
13506         connectWith:
false,
13507         containment:
false,
13508         cursor:
"auto",
13509         cursorAt:
false,
13510         dropOnEmpty:
true,
13511         forcePlaceholderSize:
false,
13512         forceHelperSize:
false,
13513         grid:
false,
13514         handle:
false,
13515         helper:
"original",
13516         items:
"> *",
13517         opacity:
false,
13518         placeholder:
false,
13519         revert:
false,
13520         scroll:
true,
13521         scrollSensitivity:
20,
13522         scrollSpeed:
20,
13523         scope:
"default",
13524         tolerance:
"intersect",
13525         zIndex:
1000,
13526
13527         
// callbacks
13528         activate:
null,
13529         beforeStop:
null,
13530         change:
null,
13531         deactivate:
null,
13532         
out: null,
13533         over:
null,
13534         receive:
null,
13535         
remove: null,
13536         sort:
null,
13537         start:
null,
13538         stop:
null,
13539         update:
null
13540     },
13541
13542     _isOverAxis: function( x, reference, size ) {
13543         
return ( x >= reference ) && ( x < ( reference + size ) );
13544     },
13545
13546     _isFloating: function( item ) {
13547         
return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
13548     },
13549
13550     _create: function() {
13551         
this.containerCache = {};
13552         
this.element.addClass("ui-sortable");
13553
13554         
//Get the items
13555         
this.refresh();
13556
13557         
//Let's determine the parent's offset
13558         
this.offset = this.element.offset();
13559
13560         
//Initialize mouse events for interaction
13561         
this._mouseInit();
13562
13563         
this._setHandleClassName();
13564
13565         
//We're ready to go
13566         
this.ready = true;
13567
13568     },
13569
13570     _setOption: function( key,
value ) {
13571         
this._super( key, value );
13572
13573         
if ( key === "handle" ) {
13574             
this._setHandleClassName();
13575         }
13576     },
13577
13578     _setHandleClassName: function() {
13579         
this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
13580         $.each(
this.items, function() {
13581             (
this.instance.options.handle ?
13582                 
this.item.find( this.instance.options.handle ) : this.item )
13583                 .addClass(
"ui-sortable-handle" );
13584         });
13585     },
13586
13587     _destroy: function() {
13588         
this.element
13589             .removeClass(
"ui-sortable ui-sortable-disabled" )
13590             .find(
".ui-sortable-handle" )
13591                 .removeClass(
"ui-sortable-handle" );
13592         
this._mouseDestroy();
13593
13594         
for ( var i = this.items.length - 1; i >= 0; i-- ) {
13595             
this.items[i].item.removeData(this.widgetName + "-item");
13596         }
13597
13598         
return this;
13599     },
13600
13601     _mouseCapture: function(
event, overrideHandle) {
13602         
var currentItem = null,
13603             validHandle =
false,
13604             that =
this;
13605
13606         
if (this.reverting) {
13607             
return false;
13608         }
13609
13610         
if(this.options.disabled || this.options.type === "static") {
13611             
return false;
13612         }
13613
13614         
//We have to refresh the items data once first
13615         
this._refreshItems(event);
13616
13617         
//Find out if the clicked node (or one of its parents) is a actual item in this.items
13618         $(
event.target).parents().each(function() {
13619             
if($.data(this, that.widgetName + "-item") === that) {
13620                 currentItem = $(
this);
13621                 
return false;
13622             }
13623         });
13624         
if($.data(event.target, that.widgetName + "-item") === that) {
13625             currentItem = $(
event.target);
13626         }
13627
13628         
if(!currentItem) {
13629             
return false;
13630         }
13631         
if(this.options.handle && !overrideHandle) {
13632             $(
this.options.handle, currentItem).find("*").addBack().each(function() {
13633                 
if(this === event.target) {
13634                     validHandle =
true;
13635                 }
13636             });
13637             
if(!validHandle) {
13638                 
return false;
13639             }
13640         }
13641
13642         
this.currentItem = currentItem;
13643         
this._removeCurrentsFromItems();
13644         
return true;
13645
13646     },
13647
13648     _mouseStart: function(
event, overrideHandle, noActivation) {
13649
13650         
var i, body,
13651             o =
this.options;
13652
13653         
this.currentContainer = this;
13654
13655         
//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
13656         
this.refreshPositions();
13657
13658         
//Create and append the visible helper
13659         
this.helper = this._createHelper(event);
13660
13661         
//Cache the helper size
13662         
this._cacheHelperProportions();
13663
13664         
/*
13665          * - Position generation -
13666          * This block generates everything position related - it
's the core of draggables.
13667          */

13668
13669         
//Cache the margins of the original element
13670         
this._cacheMargins();
13671
13672         
//Get the next scrolling parent
13673         
this.scrollParent = this.helper.scrollParent();
13674
13675         
//The element's absolute position on the page minus margins
13676         
this.offset = this.currentItem.offset();
13677         
this.offset = {
13678             top:
this.offset.top - this.margins.top,
13679             left:
this.offset.left - this.margins.left
13680         };
13681
13682         $.extend(
this.offset, {
13683             click: {
//Where the click happened, relative to the element
13684                 left:
event.pageX - this.offset.left,
13685                 top:
event.pageY - this.offset.top
13686             },
13687             parent:
this._getParentOffset(),
13688             relative:
this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
13689         });
13690
13691         
// Only after we got the offset, we can change the helper's position to absolute
13692         
// TODO: Still need to figure out a way to make relative sorting possible
13693         
this.helper.css("position", "absolute");
13694         
this.cssPosition = this.helper.css("position");
13695
13696         
//Generate the original position
13697         
this.originalPosition = this._generatePosition(event);
13698         
this.originalPageX = event.pageX;
13699         
this.originalPageY = event.pageY;
13700
13701         
//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
13702         (o.cursorAt &&
this._adjustOffsetFromHelper(o.cursorAt));
13703
13704         
//Cache the former DOM position
13705         
this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
13706
13707         
//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
13708         
if(this.helper[0] !== this.currentItem[0]) {
13709             
this.currentItem.hide();
13710         }
13711
13712         
//Create the placeholder
13713         
this._createPlaceholder();
13714
13715         
//Set a containment if given in the options
13716         
if(o.containment) {
13717             
this._setContainment();
13718         }
13719
13720         
if( o.cursor && o.cursor !== "auto" ) { // cursor option
13721             body =
this.document.find( "body" );
13722
13723             
// support: IE
13724             
this.storedCursor = body.css( "cursor" );
13725             body.css(
"cursor", o.cursor );
13726
13727             
this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
13728         }
13729
13730         
if(o.opacity) { // opacity option
13731             
if (this.helper.css("opacity")) {
13732                 
this._storedOpacity = this.helper.css("opacity");
13733             }
13734             
this.helper.css("opacity", o.opacity);
13735         }
13736
13737         
if(o.zIndex) { // zIndex option
13738             
if (this.helper.css("zIndex")) {
13739                 
this._storedZIndex = this.helper.css("zIndex");
13740             }
13741             
this.helper.css("zIndex", o.zIndex);
13742         }
13743
13744         
//Prepare scrolling
13745         
if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
13746             
this.overflowOffset = this.scrollParent.offset();
13747         }
13748
13749         
//Call callbacks
13750         
this._trigger("start", event, this._uiHash());
13751
13752         
//Recache the helper size
13753         
if(!this._preserveHelperProportions) {
13754             
this._cacheHelperProportions();
13755         }
13756
13757
13758         
//Post "activate" events to possible containers
13759         
if( !noActivation ) {
13760             
for ( i = this.containers.length - 1; i >= 0; i-- ) {
13761                 
this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
13762             }
13763         }
13764
13765         
//Prepare possible droppables
13766         
if($.ui.ddmanager) {
13767             $.ui.ddmanager.current =
this;
13768         }
13769
13770         
if ($.ui.ddmanager && !o.dropBehaviour) {
13771             $.ui.ddmanager.prepareOffsets(
this, event);
13772         }
13773
13774         
this.dragging = true;
13775
13776         
this.helper.addClass("ui-sortable-helper");
13777         
this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
13778         
return true;
13779
13780     },
13781
13782     _mouseDrag: function(
event) {
13783         
var i, item, itemElement, intersection,
13784             o =
this.options,
13785             scrolled =
false;
13786
13787         
//Compute the helpers position
13788         
this.position = this._generatePosition(event);
13789         
this.positionAbs = this._convertPositionTo("absolute");
13790
13791         
if (!this.lastPositionAbs) {
13792             
this.lastPositionAbs = this.positionAbs;
13793         }
13794
13795         
//Do scrolling
13796         
if(this.options.scroll) {
13797             
if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
13798
13799                 
if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
13800                     
this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
13801                 }
else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
13802                     
this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
13803                 }
13804
13805                 
if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
13806                     
this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
13807                 }
else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
13808                     
this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
13809                 }
13810
13811             }
else {
13812
13813                 
if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
13814                     scrolled =
this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
13815                 }
else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
13816                     scrolled =
this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
13817                 }
13818
13819                 
if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
13820                     scrolled =
this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
13821                 }
else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
13822                     scrolled =
this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
13823                 }
13824
13825             }
13826
13827             
if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
13828                 $.ui.ddmanager.prepareOffsets(
this, event);
13829             }
13830         }
13831
13832         
//Regenerate the absolute position used for position checks
13833         
this.positionAbs = this._convertPositionTo("absolute");
13834
13835         
//Set the helper position
13836         
if(!this.options.axis || this.options.axis !== "y") {
13837             
this.helper[0].style.left = this.position.left+"px";
13838         }
13839         
if(!this.options.axis || this.options.axis !== "x") {
13840             
this.helper[0].style.top = this.position.top+"px";
13841         }
13842
13843         
//Rearrange
13844         
for (i = this.items.length - 1; i >= 0; i--) {
13845
13846             
//Cache variables and intersection, continue if no intersection
13847             item =
this.items[i];
13848             itemElement = item.item[
0];
13849             intersection =
this._intersectsWithPointer(item);
13850             
if (!intersection) {
13851                 
continue;
13852             }
13853
13854             
// Only put the placeholder inside the current Container, skip all
13855             
// items from other containers. This works because when moving
13856             
// an item from one container to another the
13857             
// currentContainer is switched before the placeholder is moved.
13858             
//
13859             
// Without this, moving items in "sub-sortables" can cause
13860             
// the placeholder to jitter between the outer and inner container.
13861             
if (item.instance !== this.currentContainer) {
13862                 
continue;
13863             }
13864
13865             
// cannot intersect with itself
13866             
// no useless actions that have been done before
13867             
// no action if the item moved is the parent of the item checked
13868             
if (itemElement !== this.currentItem[0] &&
13869                 
this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
13870                 !$.contains(
this.placeholder[0], itemElement) &&
13871                 (
this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
13872             ) {
13873
13874                 
this.direction = intersection === 1 ? "down" : "up";
13875
13876                 
if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
13877                     
this._rearrange(event, item);
13878                 }
else {
13879                     
break;
13880                 }
13881
13882                 
this._trigger("change", event, this._uiHash());
13883                 
break;
13884             }
13885         }
13886
13887         
//Post events to containers
13888         
this._contactContainers(event);
13889
13890         
//Interconnect with droppables
13891         
if($.ui.ddmanager) {
13892             $.ui.ddmanager.drag(
this, event);
13893         }
13894
13895         
//Call callbacks
13896         
this._trigger("sort", event, this._uiHash());
13897
13898         
this.lastPositionAbs = this.positionAbs;
13899         
return false;
13900
13901     },
13902
13903     _mouseStop: function(
event, noPropagation) {
13904
13905         
if(!event) {
13906             
return;
13907         }
13908
13909         
//If we are using droppables, inform the manager about the drop
13910         
if ($.ui.ddmanager && !this.options.dropBehaviour) {
13911             $.ui.ddmanager.drop(
this, event);
13912         }
13913
13914         
if(this.options.revert) {
13915             
var that = this,
13916                 cur =
this.placeholder.offset(),
13917                 axis =
this.options.axis,
13918                 animation = {};
13919
13920             
if ( !axis || axis === "x" ) {
13921                 animation.left = cur.left -
this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
13922             }
13923             
if ( !axis || axis === "y" ) {
13924                 animation.top = cur.top -
this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
13925             }
13926             
this.reverting = true;
13927             $(
this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
13928                 that._clear(
event);
13929             });
13930         }
else {
13931             
this._clear(event, noPropagation);
13932         }
13933
13934         
return false;
13935
13936     },
13937
13938     cancel: function() {
13939
13940         
if(this.dragging) {
13941
13942             
this._mouseUp({ target: null });
13943
13944             
if(this.options.helper === "original") {
13945                 
this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
13946             }
else {
13947                 
this.currentItem.show();
13948             }
13949
13950             
//Post deactivating events to containers
13951             
for (var i = this.containers.length - 1; i >= 0; i--){
13952                 
this.containers[i]._trigger("deactivate", null, this._uiHash(this));
13953                 
if(this.containers[i].containerCache.over) {
13954                     
this.containers[i]._trigger("out", null, this._uiHash(this));
13955                     
this.containers[i].containerCache.over = 0;
13956                 }
13957             }
13958
13959         }
13960
13961         
if (this.placeholder) {
13962             
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
13963             
if(this.placeholder[0].parentNode) {
13964                 
this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
13965             }
13966             
if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
13967                 
this.helper.remove();
13968             }
13969
13970             $.extend(
this, {
13971                 helper:
null,
13972                 dragging:
false,
13973                 reverting:
false,
13974                 _noFinalSort:
null
13975             });
13976
13977             
if(this.domPosition.prev) {
13978                 $(
this.domPosition.prev).after(this.currentItem);
13979             }
else {
13980                 $(
this.domPosition.parent).prepend(this.currentItem);
13981             }
13982         }
13983
13984         
return this;
13985
13986     },
13987
13988     serialize: function(o) {
13989
13990         
var items = this._getItemsAsjQuery(o && o.connected),
13991             str = [];
13992         o = o || {};
13993
13994         $(items).each(function() {
13995             
var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
13996             
if (res) {
13997                 str.push((o.key || res[
1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
13998             }
13999         });
14000
14001         
if(!str.length && o.key) {
14002             str.push(o.key +
"=");
14003         }
14004
14005         
return str.join("&");
14006
14007     },
14008
14009     toArray: function(o) {
14010
14011         
var items = this._getItemsAsjQuery(o && o.connected),
14012             ret = [];
14013
14014         o = o || {};
14015
14016         items.each(function() { ret.push($(o.item ||
this).attr(o.attribute || "id") || ""); });
14017         
return ret;
14018
14019     },
14020
14021     
/* Be careful with the following core functions */
14022     _intersectsWith: function(item) {
14023
14024         
var x1 = this.positionAbs.left,
14025             x2 = x1 +
this.helperProportions.width,
14026             y1 =
this.positionAbs.top,
14027             y2 = y1 +
this.helperProportions.height,
14028             l = item.left,
14029             r = l + item.width,
14030             t = item.top,
14031             b = t + item.height,
14032             dyClick =
this.offset.click.top,
14033             dxClick =
this.offset.click.left,
14034             isOverElementHeight = (
this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
14035             isOverElementWidth = (
this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
14036             isOverElement = isOverElementHeight && isOverElementWidth;
14037
14038         
if ( this.options.tolerance === "pointer" ||
14039             
this.options.forcePointerForContainers ||
14040             (
this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
14041         ) {
14042             
return isOverElement;
14043         }
else {
14044
14045             
return (l < x1 + (this.helperProportions.width / 2) && // Right Half
14046                 x2 - (
this.helperProportions.width / 2) < r && // Left Half
14047                 t < y1 + (
this.helperProportions.height / 2) && // Bottom Half
14048                 y2 - (
this.helperProportions.height / 2) < b ); // Top Half
14049
14050         }
14051     },
14052
14053     _intersectsWithPointer: function(item) {
14054
14055         
var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
14056             isOverElementWidth = (
this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
14057             isOverElement = isOverElementHeight && isOverElementWidth,
14058             verticalDirection =
this._getDragVerticalDirection(),
14059             horizontalDirection =
this._getDragHorizontalDirection();
14060
14061         
if (!isOverElement) {
14062             
return false;
14063         }
14064
14065         
return this.floating ?
14066             ( ((horizontalDirection && horizontalDirection ===
"right") || verticalDirection === "down") ? 2 : 1 )
14067             : ( verticalDirection && (verticalDirection ===
"down" ? 2 : 1) );
14068
14069     },
14070
14071     _intersectsWithSides: function(item) {
14072
14073         
var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
14074             isOverRightHalf =
this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
14075             verticalDirection =
this._getDragVerticalDirection(),
14076             horizontalDirection =
this._getDragHorizontalDirection();
14077
14078         
if (this.floating && horizontalDirection) {
14079             
return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
14080         }
else {
14081             
return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
14082         }
14083
14084     },
14085
14086     _getDragVerticalDirection: function() {
14087         
var delta = this.positionAbs.top - this.lastPositionAbs.top;
14088         
return delta !== 0 && (delta > 0 ? "down" : "up");
14089     },
14090
14091     _getDragHorizontalDirection: function() {
14092         
var delta = this.positionAbs.left - this.lastPositionAbs.left;
14093         
return delta !== 0 && (delta > 0 ? "right" : "left");
14094     },
14095
14096     refresh: function(
event) {
14097         
this._refreshItems(event);
14098         
this._setHandleClassName();
14099         
this.refreshPositions();
14100         
return this;
14101     },
14102
14103     _connectWith: function() {
14104         
var options = this.options;
14105         
return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
14106     },
14107
14108     _getItemsAsjQuery: function(connected) {
14109
14110         
var i, j, cur, inst,
14111             items = [],
14112             queries = [],
14113             connectWith =
this._connectWith();
14114
14115         
if(connectWith && connected) {
14116             
for (i = connectWith.length - 1; i >= 0; i--){
14117                 cur = $(connectWith[i],
this.document[0]);
14118                 
for ( j = cur.length - 1; j >= 0; j--){
14119                     inst = $.data(cur[j],
this.widgetFullName);
14120                     
if(inst && inst !== this && !inst.options.disabled) {
14121                         queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(
".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
14122                     }
14123                 }
14124             }
14125         }
14126
14127         queries.push([$.isFunction(
this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
14128
14129         function addItems() {
14130             items.push(
this );
14131         }
14132         
for (i = queries.length - 1; i >= 0; i--){
14133             queries[i][
0].each( addItems );
14134         }
14135
14136         
return $(items);
14137
14138     },
14139
14140     _removeCurrentsFromItems: function() {
14141
14142         
var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
14143
14144         
this.items = $.grep(this.items, function (item) {
14145             
for (var j=0; j < list.length; j++) {
14146                 
if(list[j] === item.item[0]) {
14147                     
return false;
14148                 }
14149             }
14150             
return true;
14151         });
14152
14153     },
14154
14155     _refreshItems: function(
event) {
14156
14157         
this.items = [];
14158         
this.containers = [this];
14159
14160         
var i, j, cur, inst, targetData, _queries, item, queriesLength,
14161             items =
this.items,
14162             queries = [[$.isFunction(
this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
14163             connectWith =
this._connectWith();
14164
14165         
if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
14166             
for (i = connectWith.length - 1; i >= 0; i--){
14167                 cur = $(connectWith[i],
this.document[0]);
14168                 
for (j = cur.length - 1; j >= 0; j--){
14169                     inst = $.data(cur[j],
this.widgetFullName);
14170                     
if(inst && inst !== this && !inst.options.disabled) {
14171                         queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[
0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
14172                         
this.containers.push(inst);
14173                     }
14174                 }
14175             }
14176         }
14177
14178         
for (i = queries.length - 1; i >= 0; i--) {
14179             targetData = queries[i][
1];
14180             _queries = queries[i][
0];
14181
14182             
for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
14183                 item = $(_queries[j]);
14184
14185                 item.data(
this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
14186
14187                 items.push({
14188                     item: item,
14189                     instance: targetData,
14190                     width:
0, height: 0,
14191                     left:
0, top: 0
14192                 });
14193             }
14194         }
14195
14196     },
14197
14198     refreshPositions: function(fast) {
14199
14200         
// Determine whether items are being displayed horizontally
14201         
this.floating = this.items.length ?
14202             
this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
14203             
false;
14204
14205         
//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
14206         
if(this.offsetParent && this.helper) {
14207             
this.offset.parent = this._getParentOffset();
14208         }
14209
14210         
var i, item, t, p;
14211
14212         
for (i = this.items.length - 1; i >= 0; i--){
14213             item =
this.items[i];
14214
14215             
//We ignore calculating positions of all connected containers when we're not over them
14216             
if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
14217                 
continue;
14218             }
14219
14220             t =
this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
14221
14222             
if (!fast) {
14223                 item.width = t.outerWidth();
14224                 item.height = t.outerHeight();
14225             }
14226
14227             p = t.offset();
14228             item.left = p.left;
14229             item.top = p.top;
14230         }
14231
14232         
if(this.options.custom && this.options.custom.refreshContainers) {
14233             
this.options.custom.refreshContainers.call(this);
14234         }
else {
14235             
for (i = this.containers.length - 1; i >= 0; i--){
14236                 p =
this.containers[i].element.offset();
14237                 
this.containers[i].containerCache.left = p.left;
14238                 
this.containers[i].containerCache.top = p.top;
14239                 
this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
14240                 
this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
14241             }
14242         }
14243
14244         
return this;
14245     },
14246
14247     _createPlaceholder: function(that) {
14248         that = that ||
this;
14249         
var className,
14250             o = that.options;
14251
14252         
if(!o.placeholder || o.placeholder.constructor === String) {
14253             className = o.placeholder;
14254             o.placeholder = {
14255                 element: function() {
14256
14257                     
var nodeName = that.currentItem[0].nodeName.toLowerCase(),
14258                         element = $(
"<" + nodeName + ">", that.document[0] )
14259                             .addClass(className || that.currentItem[
0].className+" ui-sortable-placeholder")
14260                             .removeClass(
"ui-sortable-helper");
14261
14262                     
if ( nodeName === "tbody" ) {
14263                         that._createTrPlaceholder(
14264                             that.currentItem.find(
"tr" ).eq( 0 ),
14265                             $(
"<tr>", that.document[ 0 ] ).appendTo( element )
14266                         );
14267                     }
else if ( nodeName === "tr" ) {
14268                         that._createTrPlaceholder( that.currentItem, element );
14269                     }
else if ( nodeName === "img" ) {
14270                         element.attr(
"src", that.currentItem.attr( "src" ) );
14271                     }
14272
14273                     
if ( !className ) {
14274                         element.css(
"visibility", "hidden" );
14275                     }
14276
14277                     
return element;
14278                 },
14279                 update: function(container, p) {
14280
14281                     
// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
14282                     
// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
14283                     
if(className && !o.forcePlaceholderSize) {
14284                         
return;
14285                     }
14286
14287                     
//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
14288                     
if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
14289                     
if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
14290                 }
14291             };
14292         }
14293
14294         
//Create the placeholder
14295         that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
14296
14297         
//Append it after the actual current item
14298         that.currentItem.after(that.placeholder);
14299
14300         
//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
14301         o.placeholder.update(that, that.placeholder);
14302
14303     },
14304
14305     _createTrPlaceholder: function( sourceTr, targetTr ) {
14306         
var that = this;
14307
14308         sourceTr.children().each(function() {
14309             $(
"<td>&#160;</td>", that.document[ 0 ] )
14310                 .attr(
"colspan", $( this ).attr( "colspan" ) || 1 )
14311                 .appendTo( targetTr );
14312         });
14313     },
14314
14315     _contactContainers: function(
event) {
14316         
var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
14317             innermostContainer =
null,
14318             innermostIndex =
null;
14319
14320         
// get innermost container that intersects with item
14321         
for (i = this.containers.length - 1; i >= 0; i--) {
14322
14323             
// never consider a container that's located within the item itself
14324             
if($.contains(this.currentItem[0], this.containers[i].element[0])) {
14325                 
continue;
14326             }
14327
14328             
if(this._intersectsWith(this.containers[i].containerCache)) {
14329
14330                 
// if we've already found a container and it's more "inner" than this, then continue
14331                 
if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
14332                     
continue;
14333                 }
14334
14335                 innermostContainer =
this.containers[i];
14336                 innermostIndex = i;
14337
14338             }
else {
14339                 
// container doesn't intersect. trigger "out" event if necessary
14340                 
if(this.containers[i].containerCache.over) {
14341                     
this.containers[i]._trigger("out", event, this._uiHash(this));
14342                     
this.containers[i].containerCache.over = 0;
14343                 }
14344             }
14345
14346         }
14347
14348         
// if no intersecting containers found, return
14349         
if(!innermostContainer) {
14350             
return;
14351         }
14352
14353         
// move the item into the container if it's not there already
14354         
if(this.containers.length === 1) {
14355             
if (!this.containers[innermostIndex].containerCache.over) {
14356                 
this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
14357                 
this.containers[innermostIndex].containerCache.over = 1;
14358             }
14359         }
else {
14360
14361             
//When entering a new container, we will find the item with the least distance and append our item near it
14362             dist =
10000;
14363             itemWithLeastDistance =
null;
14364             floating = innermostContainer.floating ||
this._isFloating(this.currentItem);
14365             posProperty = floating ?
"left" : "top";
14366             sizeProperty = floating ?
"width" : "height";
14367             axis = floating ?
"clientX" : "clientY";
14368
14369             
for (j = this.items.length - 1; j >= 0; j--) {
14370                 
if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
14371                     
continue;
14372                 }
14373                 
if(this.items[j].item[0] === this.currentItem[0]) {
14374                     
continue;
14375                 }
14376
14377                 cur =
this.items[j].item.offset()[posProperty];
14378                 nearBottom =
false;
14379                 
if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
14380                     nearBottom =
true;
14381                 }
14382
14383                 
if ( Math.abs( event[ axis ] - cur ) < dist ) {
14384                     dist = Math.abs(
event[ axis ] - cur );
14385                     itemWithLeastDistance =
this.items[ j ];
14386                     
this.direction = nearBottom ? "up": "down";
14387                 }
14388             }
14389
14390             
//Check if dropOnEmpty is enabled
14391             
if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
14392                 
return;
14393             }
14394
14395             
if(this.currentContainer === this.containers[innermostIndex]) {
14396                 
if ( !this.currentContainer.containerCache.over ) {
14397                     
this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
14398                     
this.currentContainer.containerCache.over = 1;
14399                 }
14400                 
return;
14401             }
14402
14403             itemWithLeastDistance ?
this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
14404             
this._trigger("change", event, this._uiHash());
14405             
this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
14406             
this.currentContainer = this.containers[innermostIndex];
14407
14408             
//Update the placeholder
14409             
this.options.placeholder.update(this.currentContainer, this.placeholder);
14410
14411             
this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
14412             
this.containers[innermostIndex].containerCache.over = 1;
14413         }
14414
14415
14416     },
14417
14418     _createHelper: function(
event) {
14419
14420         
var o = this.options,
14421             helper = $.isFunction(o.helper) ? $(o.helper.apply(
this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
14422
14423         
//Add the helper to the DOM if that didn't happen already
14424         
if(!helper.parents("body").length) {
14425             $(o.appendTo !==
"parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
14426         }
14427
14428         
if(helper[0] === this.currentItem[0]) {
14429             
this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
14430         }
14431
14432         
if(!helper[0].style.width || o.forceHelperSize) {
14433             helper.width(
this.currentItem.width());
14434         }
14435         
if(!helper[0].style.height || o.forceHelperSize) {
14436             helper.height(
this.currentItem.height());
14437         }
14438
14439         
return helper;
14440
14441     },
14442
14443     _adjustOffsetFromHelper: function(obj) {
14444         
if (typeof obj === "string") {
14445             obj = obj.split(
" ");
14446         }
14447         
if ($.isArray(obj)) {
14448             obj = {left: +obj[
0], top: +obj[1] || 0};
14449         }
14450         
if ("left" in obj) {
14451             
this.offset.click.left = obj.left + this.margins.left;
14452         }
14453         
if ("right" in obj) {
14454             
this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
14455         }
14456         
if ("top" in obj) {
14457             
this.offset.click.top = obj.top + this.margins.top;
14458         }
14459         
if ("bottom" in obj) {
14460             
this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
14461         }
14462     },
14463
14464     _getParentOffset: function() {
14465
14466
14467         
//Get the offsetParent and cache its position
14468         
this.offsetParent = this.helper.offsetParent();
14469         
var po = this.offsetParent.offset();
14470
14471         
// This is a special case where we need to modify a offset calculated on start, since the following happened:
14472         
// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
14473         
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
14474         
// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
14475         
if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
14476             po.left +=
this.scrollParent.scrollLeft();
14477             po.top +=
this.scrollParent.scrollTop();
14478         }
14479
14480         
// This needs to be actually done for all browsers, since pageX/pageY includes this information
14481         
// with an ugly IE fix
14482         
if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
14483             po = { top:
0, left: 0 };
14484         }
14485
14486         
return {
14487             top: po.top + (parseInt(
this.offsetParent.css("borderTopWidth"),10) || 0),
14488             left: po.left + (parseInt(
this.offsetParent.css("borderLeftWidth"),10) || 0)
14489         };
14490
14491     },
14492
14493     _getRelativeOffset: function() {
14494
14495         
if(this.cssPosition === "relative") {
14496             
var p = this.currentItem.position();
14497             
return {
14498                 top: p.top - (parseInt(
this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
14499                 left: p.left - (parseInt(
this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
14500             };
14501         }
else {
14502             
return { top: 0, left: 0 };
14503         }
14504
14505     },
14506
14507     _cacheMargins: function() {
14508         
this.margins = {
14509             left: (parseInt(
this.currentItem.css("marginLeft"),10) || 0),
14510             top: (parseInt(
this.currentItem.css("marginTop"),10) || 0)
14511         };
14512     },
14513
14514     _cacheHelperProportions: function() {
14515         
this.helperProportions = {
14516             width:
this.helper.outerWidth(),
14517             height:
this.helper.outerHeight()
14518         };
14519     },
14520
14521     _setContainment: function() {
14522
14523         
var ce, co, over,
14524             o =
this.options;
14525         
if(o.containment === "parent") {
14526             o.containment =
this.helper[0].parentNode;
14527         }
14528         
if(o.containment === "document" || o.containment === "window") {
14529             
this.containment = [
14530                 
0 - this.offset.relative.left - this.offset.parent.left,
14531                 
0 - this.offset.relative.top - this.offset.parent.top,
14532                 o.containment ===
"document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
14533                 (o.containment ===
"document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
14534             ];
14535         }
14536
14537         
if(!(/^(document|window|parent)$/).test(o.containment)) {
14538             ce = $(o.containment)[
0];
14539             co = $(o.containment).offset();
14540             over = ($(ce).css(
"overflow") !== "hidden");
14541
14542             
this.containment = [
14543                 co.left + (parseInt($(ce).css(
"borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
14544                 co.top + (parseInt($(ce).css(
"borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
14545                 co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(
"borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
14546                 co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(
"borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
14547             ];
14548         }
14549
14550     },
14551
14552     _convertPositionTo: function(d, pos) {
14553
14554         
if(!pos) {
14555             pos =
this.position;
14556         }
14557         
var mod = d === "absolute" ? 1 : -1,
14558             scroll =
this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
14559             scrollIsRootNode = (/(html|body)/i).test(scroll[
0].tagName);
14560
14561         
return {
14562             top: (
14563                 pos.top +
// The absolute mouse position
14564                 
this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
14565                 
this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
14566                 ( (
this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
14567             ),
14568             left: (
14569                 pos.left +
// The absolute mouse position
14570                 
this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
14571                 
this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
14572                 ( (
this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
14573             )
14574         };
14575
14576     },
14577
14578     _generatePosition: function(
event) {
14579
14580         
var top, left,
14581             o =
this.options,
14582             pageX =
event.pageX,
14583             pageY =
event.pageY,
14584             scroll =
this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
14585
14586         
// This is another very weird special case that only happens for relative elements:
14587         
// 1. If the css position is relative
14588         
// 2. and the scroll parent is the document or similar to the offset parent
14589         
// we have to refresh the relative offset during the scroll so there are no jumps
14590         
if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
14591             
this.offset.relative = this._getRelativeOffset();
14592         }
14593
14594         
/*
14595          * - Position constraining -
14596          * Constrain the position to a mix of grid, containment.
14597          */

14598
14599         
if(this.originalPosition) { //If we are not dragging yet, we won't check for options
14600
14601             
if(this.containment) {
14602                 
if(event.pageX - this.offset.click.left < this.containment[0]) {
14603                     pageX =
this.containment[0] + this.offset.click.left;
14604                 }
14605                 
if(event.pageY - this.offset.click.top < this.containment[1]) {
14606                     pageY =
this.containment[1] + this.offset.click.top;
14607                 }
14608                 
if(event.pageX - this.offset.click.left > this.containment[2]) {
14609                     pageX =
this.containment[2] + this.offset.click.left;
14610                 }
14611                 
if(event.pageY - this.offset.click.top > this.containment[3]) {
14612                     pageY =
this.containment[3] + this.offset.click.top;
14613                 }
14614             }
14615
14616             
if(o.grid) {
14617                 top =
this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
14618                 pageY =
this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
14619
14620                 left =
this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
14621                 pageX =
this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
14622             }
14623
14624         }
14625
14626         
return {
14627             top: (
14628                 pageY -
// The absolute mouse position
14629                 
this.offset.click.top - // Click offset (relative to the element)
14630                 
this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
14631                 
this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
14632                 ( (
this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
14633             ),
14634             left: (
14635                 pageX -
// The absolute mouse position
14636                 
this.offset.click.left - // Click offset (relative to the element)
14637                 
this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
14638                 
this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
14639                 ( (
this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
14640             )
14641         };
14642
14643     },
14644
14645     _rearrange: function(
event, i, a, hardRefresh) {
14646
14647         a ? a[
0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
14648
14649         
//Various things done here to improve the performance:
14650         
// 1. we create a setTimeout, that calls refreshPositions
14651         
// 2. on the instance, we have a counter variable, that get's higher after every append
14652         
// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
14653         
// 4. this lets only the last addition to the timeout stack through
14654         
this.counter = this.counter ? ++this.counter : 1;
14655         
var counter = this.counter;
14656
14657         
this._delay(function() {
14658             
if(counter === this.counter) {
14659                 
this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
14660             }
14661         });
14662
14663     },
14664
14665     _clear: function(
event, noPropagation) {
14666
14667         
this.reverting = false;
14668         
// We delay all events that have to be triggered to after the point where the placeholder has been removed and
14669         
// everything else normalized again
14670         
var i,
14671             delayedTriggers = [];
14672
14673         
// We first have to update the dom position of the actual currentItem
14674         
// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
14675         
if(!this._noFinalSort && this.currentItem.parent().length) {
14676             
this.placeholder.before(this.currentItem);
14677         }
14678         
this._noFinalSort = null;
14679
14680         
if(this.helper[0] === this.currentItem[0]) {
14681             
for(i in this._storedCSS) {
14682                 
if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
14683                     
this._storedCSS[i] = "";
14684                 }
14685             }
14686             
this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
14687         }
else {
14688             
this.currentItem.show();
14689         }
14690
14691         
if(this.fromOutside && !noPropagation) {
14692             delayedTriggers.push(function(
event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
14693         }
14694         
if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
14695             delayedTriggers.push(function(
event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
14696         }
14697
14698         
// Check if the items Container has Changed and trigger appropriate
14699         
// events.
14700         
if (this !== this.currentContainer) {
14701             
if(!noPropagation) {
14702                 delayedTriggers.push(function(
event) { this._trigger("remove", event, this._uiHash()); });
14703                 delayedTriggers.push((function(c) {
return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
14704                 delayedTriggers.push((function(c) {
return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
14705             }
14706         }
14707
14708
14709         
//Post events to containers
14710         function delayEvent( type, instance, container ) {
14711             
return function( event ) {
14712                 container._trigger( type,
event, instance._uiHash( instance ) );
14713             };
14714         }
14715         
for (i = this.containers.length - 1; i >= 0; i--){
14716             
if (!noPropagation) {
14717                 delayedTriggers.push( delayEvent(
"deactivate", this, this.containers[ i ] ) );
14718             }
14719             
if(this.containers[i].containerCache.over) {
14720                 delayedTriggers.push( delayEvent(
"out", this, this.containers[ i ] ) );
14721                 
this.containers[i].containerCache.over = 0;
14722             }
14723         }
14724
14725         
//Do what was originally in plugins
14726         
if ( this.storedCursor ) {
14727             
this.document.find( "body" ).css( "cursor", this.storedCursor );
14728             
this.storedStylesheet.remove();
14729         }
14730         
if(this._storedOpacity) {
14731             
this.helper.css("opacity", this._storedOpacity);
14732         }
14733         
if(this._storedZIndex) {
14734             
this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
14735         }
14736
14737         
this.dragging = false;
14738
14739         
if(!noPropagation) {
14740             
this._trigger("beforeStop", event, this._uiHash());
14741         }
14742
14743         
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
14744         
this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
14745
14746         
if ( !this.cancelHelperRemoval ) {
14747             
if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
14748                 
this.helper.remove();
14749             }
14750             
this.helper = null;
14751         }
14752
14753         
if(!noPropagation) {
14754             
for (i=0; i < delayedTriggers.length; i++) {
14755                 delayedTriggers[i].call(
this, event);
14756             }
//Trigger all delayed events
14757             
this._trigger("stop", event, this._uiHash());
14758         }
14759
14760         
this.fromOutside = false;
14761         
return !this.cancelHelperRemoval;
14762
14763     },
14764
14765     _trigger: function() {
14766         
if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
14767             
this.cancel();
14768         }
14769     },
14770
14771     _uiHash: function(_inst) {
14772         
var inst = _inst || this;
14773         
return {
14774             helper: inst.helper,
14775             placeholder: inst.placeholder || $([]),
14776             position: inst.position,
14777             originalPosition: inst.originalPosition,
14778             offset: inst.positionAbs,
14779             item: inst.currentItem,
14780             sender: _inst ? _inst.element :
null
14781         };
14782     }
14783
14784 });

14785
14786
14787 /*!
14788  * jQuery UI Spinner
1.11.4
14789  * http://jqueryui.com
14790  *
14791  * Copyright jQuery Foundation and other contributors
14792  * Released under the MIT license.
14793  * http://jquery.org/license
14794  *
14795  * http://api.jqueryui.com/spinner/
14796  */

14797
14798
14799 function spinner_modifier( fn ) {
14800     
return function() {
14801         
var previous = this.element.val();
14802         fn.apply(
this, arguments );
14803         
this._refresh();
14804         
if ( previous !== this.element.val() ) {
14805             
this._trigger( "change" );
14806         }
14807     };
14808 }

14809
14810 var
spinner = $.widget( "ui.spinner", {
14811     version:
"1.11.4",
14812     defaultElement:
"<input>",
14813     widgetEventPrefix:
"spin",
14814     options: {
14815         culture:
null,
14816         icons: {
14817             down:
"ui-icon-triangle-1-s",
14818             up:
"ui-icon-triangle-1-n"
14819         },
14820         incremental:
true,
14821         max:
null,
14822         min:
null,
14823         numberFormat:
null,
14824         page:
10,
14825         step:
1,
14826
14827         change:
null,
14828         spin:
null,
14829         start:
null,
14830         stop:
null
14831     },
14832
14833     _create: function() {
14834         
// handle string values that need to be parsed
14835         
this._setOption( "max", this.options.max );
14836         
this._setOption( "min", this.options.min );
14837         
this._setOption( "step", this.options.step );
14838
14839         
// Only format if there is a value, prevents the field from being marked
14840         
// as invalid in Firefox, see #9573.
14841         
if ( this.value() !== "" ) {
14842             
// Format the value, but don't constrain.
14843             
this._value( this.element.val(), true );
14844         }
14845
14846         
this._draw();
14847         
this._on( this._events );
14848         
this._refresh();
14849
14850         
// turning off autocomplete prevents the browser from remembering the
14851         
// value when navigating through history, so we re-enable autocomplete
14852         
// if the page is unloaded before the widget is destroyed. #7790
14853         
this._on( this.window, {
14854             beforeunload: function() {
14855                 
this.element.removeAttr( "autocomplete" );
14856             }
14857         });
14858     },
14859
14860     _getCreateOptions: function() {
14861         
var options = {},
14862             element =
this.element;
14863
14864         $.each( [
"min", "max", "step" ], function( i, option ) {
14865             
var value = element.attr( option );
14866             
if ( value !== undefined && value.length ) {
14867                 options[ option ] =
value;
14868             }
14869         });
14870
14871         
return options;
14872     },
14873
14874     _events: {
14875         keydown: function(
event ) {
14876             
if ( this._start( event ) && this._keydown( event ) ) {
14877                 
event.preventDefault();
14878             }
14879         },
14880         keyup:
"_stop",
14881         focus: function() {
14882             
this.previous = this.element.val();
14883         },
14884         blur: function(
event ) {
14885             
if ( this.cancelBlur ) {
14886                 delete
this.cancelBlur;
14887                 
return;
14888             }
14889
14890             
this._stop();
14891             
this._refresh();
14892             
if ( this.previous !== this.element.val() ) {
14893                 
this._trigger( "change", event );
14894             }
14895         },
14896         mousewheel: function(
event, delta ) {
14897             
if ( !delta ) {
14898                 
return;
14899             }
14900             
if ( !this.spinning && !this._start( event ) ) {
14901                 
return false;
14902             }
14903
14904             
this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
14905             clearTimeout(
this.mousewheelTimer );
14906             
this.mousewheelTimer = this._delay(function() {
14907                 
if ( this.spinning ) {
14908                     
this._stop( event );
14909                 }
14910             },
100 );
14911             
event.preventDefault();
14912         },
14913         
"mousedown .ui-spinner-button": function( event ) {
14914             
var previous;
14915
14916             
// We never want the buttons to have focus; whenever the user is
14917             
// interacting with the spinner, the focus should be on the input.
14918             
// If the input is focused then this.previous is properly set from
14919             
// when the input first received focus. If the input is not focused
14920             
// then we need to set this.previous based on the value before spinning.
14921             previous =
this.element[0] === this.document[0].activeElement ?
14922                 
this.previous : this.element.val();
14923             function checkFocus() {
14924                 
var isActive = this.element[0] === this.document[0].activeElement;
14925                 
if ( !isActive ) {
14926                     
this.element.focus();
14927                     
this.previous = previous;
14928                     
// support: IE
14929                     
// IE sets focus asynchronously, so we need to check if focus
14930                     
// moved off of the input because the user clicked on the button.
14931                     
this._delay(function() {
14932                         
this.previous = previous;
14933                     });
14934                 }
14935             }
14936
14937             
// ensure focus is on (or stays on) the text field
14938             
event.preventDefault();
14939             checkFocus.call(
this );
14940
14941             
// support: IE
14942             
// IE doesn't prevent moving focus even with event.preventDefault()
14943             
// so we set a flag to know when we should ignore the blur event
14944             
// and check (again) if focus moved off of the input.
14945             
this.cancelBlur = true;
14946             
this._delay(function() {
14947                 delete
this.cancelBlur;
14948                 checkFocus.call(
this );
14949             });
14950
14951             
if ( this._start( event ) === false ) {
14952                 
return;
14953             }
14954
14955             
this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
14956         },
14957         
"mouseup .ui-spinner-button": "_stop",
14958         
"mouseenter .ui-spinner-button": function( event ) {
14959             
// button will add ui-state-active if mouse was down while mouseleave and kept down
14960             
if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
14961                 
return;
14962             }
14963
14964             
if ( this._start( event ) === false ) {
14965                 
return false;
14966             }
14967             
this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
14968         },
14969         
// TODO: do we really want to consider this a stop?
14970         
// shouldn't we just stop the repeater and wait until mouseup before
14971         
// we trigger the stop event?
14972         
"mouseleave .ui-spinner-button": "_stop"
14973     },
14974
14975     _draw: function() {
14976         
var uiSpinner = this.uiSpinner = this.element
14977             .addClass(
"ui-spinner-input" )
14978             .attr(
"autocomplete", "off" )
14979             .wrap(
this._uiSpinnerHtml() )
14980             .parent()
14981                 
// add buttons
14982                 .append(
this._buttonHtml() );
14983
14984         
this.element.attr( "role", "spinbutton" );
14985
14986         
// button bindings
14987         
this.buttons = uiSpinner.find( ".ui-spinner-button" )
14988             .attr(
"tabIndex", -1 )
14989             .button()
14990             .removeClass(
"ui-corner-all" );
14991
14992         
// IE 6 doesn't understand height: 50% for the buttons
14993         
// unless the wrapper has an explicit height
14994         
if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
14995                 uiSpinner.height() >
0 ) {
14996             uiSpinner.height( uiSpinner.height() );
14997         }
14998
14999         
// disable spinner if element was already disabled
15000         
if ( this.options.disabled ) {
15001             
this.disable();
15002         }
15003     },
15004
15005     _keydown: function(
event ) {
15006         
var options = this.options,
15007             keyCode = $.ui.keyCode;
15008
15009         
switch ( event.keyCode ) {
15010         
case keyCode.UP:
15011             
this._repeat( null, 1, event );
15012             
return true;
15013         
case keyCode.DOWN:
15014             
this._repeat( null, -1, event );
15015             
return true;
15016         
case keyCode.PAGE_UP:
15017             
this._repeat( null, options.page, event );
15018             
return true;
15019         
case keyCode.PAGE_DOWN:
15020             
this._repeat( null, -options.page, event );
15021             
return true;
15022         }
15023
15024         
return false;
15025     },
15026
15027     _uiSpinnerHtml: function() {
15028         
return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
15029     },
15030
15031     _buttonHtml: function() {
15032         
return "" +
15033             
"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
15034                 
"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
15035             
"</a>" +
15036             
"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
15037                 
"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
15038             
"</a>";
15039     },
15040
15041     _start: function(
event ) {
15042         
if ( !this.spinning && this._trigger( "start", event ) === false ) {
15043             
return false;
15044         }
15045
15046         
if ( !this.counter ) {
15047             
this.counter = 1;
15048         }
15049         
this.spinning = true;
15050         
return true;
15051     },
15052
15053     _repeat: function( i, steps,
event ) {
15054         i = i ||
500;
15055
15056         clearTimeout(
this.timer );
15057         
this.timer = this._delay(function() {
15058             
this._repeat( 40, steps, event );
15059         }, i );
15060
15061         
this._spin( steps * this.options.step, event );
15062     },
15063
15064     _spin: function( step,
event ) {
15065         
var value = this.value() || 0;
15066
15067         
if ( !this.counter ) {
15068             
this.counter = 1;
15069         }
15070
15071         
value = this._adjustValue( value + step * this._increment( this.counter ) );
15072
15073         
if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
15074             
this._value( value );
15075             
this.counter++;
15076         }
15077     },
15078
15079     _increment: function( i ) {
15080         
var incremental = this.options.incremental;
15081
15082         
if ( incremental ) {
15083             
return $.isFunction( incremental ) ?
15084                 incremental( i ) :
15085                 Math.floor( i * i * i /
50000 - i * i / 500 + 17 * i / 200 + 1 );
15086         }
15087
15088         
return 1;
15089     },
15090
15091     _precision: function() {
15092         
var precision = this._precisionOf( this.options.step );
15093         
if ( this.options.min !== null ) {
15094             precision = Math.max( precision,
this._precisionOf( this.options.min ) );
15095         }
15096         
return precision;
15097     },
15098
15099     _precisionOf: function( num ) {
15100         
var str = num.toString(),
15101             
decimal = str.indexOf( "." );
15102         
return decimal === -1 ? 0 : str.length - decimal - 1;
15103     },
15104
15105     _adjustValue: function(
value ) {
15106         
var base, aboveMin,
15107             options =
this.options;
15108
15109         
// make sure we're at a valid step
15110         
// - find out where we are relative to the base (min or 0)
15111         
base = options.min !== null ? options.min : 0;
15112         aboveMin =
value - base;
15113         
// - round to the nearest step
15114         aboveMin = Math.round(aboveMin / options.step) * options.step;
15115         
// - rounding is based on 0, so adjust back to our base
15116         
value = base + aboveMin;
15117
15118         
// fix precision from bad JS floating point math
15119         
value = parseFloat( value.toFixed( this._precision() ) );
15120
15121         
// clamp the value
15122         
if ( options.max !== null && value > options.max) {
15123             
return options.max;
15124         }
15125         
if ( options.min !== null && value < options.min ) {
15126             
return options.min;
15127         }
15128
15129         
return value;
15130     },
15131
15132     _stop: function(
event ) {
15133         
if ( !this.spinning ) {
15134             
return;
15135         }
15136
15137         clearTimeout(
this.timer );
15138         clearTimeout(
this.mousewheelTimer );
15139         
this.counter = 0;
15140         
this.spinning = false;
15141         
this._trigger( "stop", event );
15142     },
15143
15144     _setOption: function( key,
value ) {
15145         
if ( key === "culture" || key === "numberFormat" ) {
15146             
var prevValue = this._parse( this.element.val() );
15147             
this.options[ key ] = value;
15148             
this.element.val( this._format( prevValue ) );
15149             
return;
15150         }
15151
15152         
if ( key === "max" || key === "min" || key === "step" ) {
15153             
if ( typeof value === "string" ) {
15154                 
value = this._parse( value );
15155             }
15156         }
15157         
if ( key === "icons" ) {
15158             
this.buttons.first().find( ".ui-icon" )
15159                 .removeClass(
this.options.icons.up )
15160                 .addClass(
value.up );
15161             
this.buttons.last().find( ".ui-icon" )
15162                 .removeClass(
this.options.icons.down )
15163                 .addClass(
value.down );
15164         }
15165
15166         
this._super( key, value );
15167
15168         
if ( key === "disabled" ) {
15169             
this.widget().toggleClass( "ui-state-disabled", !!value );
15170             
this.element.prop( "disabled", !!value );
15171             
this.buttons.button( value ? "disable" : "enable" );
15172         }
15173     },
15174
15175     _setOptions: spinner_modifier(function( options ) {
15176         
this._super( options );
15177     }),
15178
15179     _parse: function( val ) {
15180         
if ( typeof val === "string" && val !== "" ) {
15181             val = window.Globalize &&
this.options.numberFormat ?
15182                 Globalize.parseFloat( val,
10, this.options.culture ) : +val;
15183         }
15184         
return val === "" || isNaN( val ) ? null : val;
15185     },
15186
15187     _format: function(
value ) {
15188         
if ( value === "" ) {
15189             
return "";
15190         }
15191         
return window.Globalize && this.options.numberFormat ?
15192             Globalize.format(
value, this.options.numberFormat, this.options.culture ) :
15193             
value;
15194     },
15195
15196     _refresh: function() {
15197         
this.element.attr({
15198             
"aria-valuemin": this.options.min,
15199             
"aria-valuemax": this.options.max,
15200             
// TODO: what should we do with values that can't be parsed?
15201             
"aria-valuenow": this._parse( this.element.val() )
15202         });
15203     },
15204
15205     isValid: function() {
15206         
var value = this.value();
15207
15208         
// null is invalid
15209         
if ( value === null ) {
15210             
return false;
15211         }
15212
15213         
// if value gets adjusted, it's invalid
15214         
return value === this._adjustValue( value );
15215     },
15216
15217     
// update the value without triggering change
15218     _value: function(
value, allowAny ) {
15219         
var parsed;
15220         
if ( value !== "" ) {
15221             parsed =
this._parse( value );
15222             
if ( parsed !== null ) {
15223                 
if ( !allowAny ) {
15224                     parsed =
this._adjustValue( parsed );
15225                 }
15226                 
value = this._format( parsed );
15227             }
15228         }
15229         
this.element.val( value );
15230         
this._refresh();
15231     },
15232
15233     _destroy: function() {
15234         
this.element
15235             .removeClass(
"ui-spinner-input" )
15236             .prop(
"disabled", false )
15237             .removeAttr(
"autocomplete" )
15238             .removeAttr(
"role" )
15239             .removeAttr(
"aria-valuemin" )
15240             .removeAttr(
"aria-valuemax" )
15241             .removeAttr(
"aria-valuenow" );
15242         
this.uiSpinner.replaceWith( this.element );
15243     },
15244
15245     stepUp: spinner_modifier(function( steps ) {
15246         
this._stepUp( steps );
15247     }),
15248     _stepUp: function( steps ) {
15249         
if ( this._start() ) {
15250             
this._spin( (steps || 1) * this.options.step );
15251             
this._stop();
15252         }
15253     },
15254
15255     stepDown: spinner_modifier(function( steps ) {
15256         
this._stepDown( steps );
15257     }),
15258     _stepDown: function( steps ) {
15259         
if ( this._start() ) {
15260             
this._spin( (steps || 1) * -this.options.step );
15261             
this._stop();
15262         }
15263     },
15264
15265     pageUp: spinner_modifier(function( pages ) {
15266         
this._stepUp( (pages || 1) * this.options.page );
15267     }),
15268
15269     pageDown: spinner_modifier(function( pages ) {
15270         
this._stepDown( (pages || 1) * this.options.page );
15271     }),
15272
15273     
value: function( newVal ) {
15274         
if ( !arguments.length ) {
15275             
return this._parse( this.element.val() );
15276         }
15277         spinner_modifier(
this._value ).call( this, newVal );
15278     },
15279
15280     widget: function() {
15281         
return this.uiSpinner;
15282     }
15283 });

15284
15285
15286 /*!
15287  * jQuery UI Tabs
1.11.4
15288  * http://jqueryui.com
15289  *
15290  * Copyright jQuery Foundation and other contributors
15291  * Released under the MIT license.
15292  * http://jquery.org/license
15293  *
15294  * http://api.jqueryui.com/tabs/
15295  */

15296
15297
15298 var
tabs = $.widget( "ui.tabs", {
15299     version:
"1.11.4",
15300     delay:
300,
15301     options: {
15302         active:
null,
15303         collapsible:
false,
15304         
event: "click",
15305         heightStyle:
"content",
15306         hide:
null,
15307         show:
null,
15308
15309         
// callbacks
15310         activate:
null,
15311         beforeActivate:
null,
15312         beforeLoad:
null,
15313         load:
null
15314     },
15315
15316     _isLocal: (function() {
15317         
var rhash = /#.*$/;
15318
15319         
return function( anchor ) {
15320             
var anchorUrl, locationUrl;
15321
15322             
// support: IE7
15323             
// IE7 doesn't normalize the href property when set via script (#9317)
15324             anchor = anchor.cloneNode(
false );
15325
15326             anchorUrl = anchor.href.replace( rhash,
"" );
15327             locationUrl = location.href.replace( rhash,
"" );
15328
15329             
// decoding may throw an error if the URL isn't UTF-8 (#9518)
15330             
try {
15331                 anchorUrl = decodeURIComponent( anchorUrl );
15332             }
catch ( error ) {}
15333             
try {
15334                 locationUrl = decodeURIComponent( locationUrl );
15335             }
catch ( error ) {}
15336
15337             
return anchor.hash.length > 1 && anchorUrl === locationUrl;
15338         };
15339     })(),
15340
15341     _create: function() {
15342         
var that = this,
15343             options =
this.options;
15344
15345         
this.running = false;
15346
15347         
this.element
15348             .addClass(
"ui-tabs ui-widget ui-widget-content ui-corner-all" )
15349             .toggleClass(
"ui-tabs-collapsible", options.collapsible );
15350
15351         
this._processTabs();
15352         options.active =
this._initialActive();
15353
15354         
// Take disabling tabs via class attribute from HTML
15355         
// into account and update option properly.
15356         
if ( $.isArray( options.disabled ) ) {
15357             options.disabled = $.unique( options.disabled.concat(
15358                 $.map(
this.tabs.filter( ".ui-state-disabled" ), function( li ) {
15359                     
return that.tabs.index( li );
15360                 })
15361             ) ).sort();
15362         }
15363
15364         
// check for length avoids error when initializing empty list
15365         
if ( this.options.active !== false && this.anchors.length ) {
15366             
this.active = this._findActive( options.active );
15367         }
else {
15368             
this.active = $();
15369         }
15370
15371         
this._refresh();
15372
15373         
if ( this.active.length ) {
15374             
this.load( options.active );
15375         }
15376     },
15377
15378     _initialActive: function() {
15379         
var active = this.options.active,
15380             collapsible =
this.options.collapsible,
15381             locationHash = location.hash.substring(
1 );
15382
15383         
if ( active === null ) {
15384             
// check the fragment identifier in the URL
15385             
if ( locationHash ) {
15386                 
this.tabs.each(function( i, tab ) {
15387                     
if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
15388                         active = i;
15389                         
return false;
15390                     }
15391                 });
15392             }
15393
15394             
// check for a tab marked active via a class
15395             
if ( active === null ) {
15396                 active =
this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
15397             }
15398
15399             
// no active tab, set to false
15400             
if ( active === null || active === -1 ) {
15401                 active =
this.tabs.length ? 0 : false;
15402             }
15403         }
15404
15405         
// handle numbers: negative, out of range
15406         
if ( active !== false ) {
15407             active =
this.tabs.index( this.tabs.eq( active ) );
15408             
if ( active === -1 ) {
15409                 active = collapsible ?
false : 0;
15410             }
15411         }
15412
15413         
// don't allow collapsible: false and active: false
15414         
if ( !collapsible && active === false && this.anchors.length ) {
15415             active =
0;
15416         }
15417
15418         
return active;
15419     },
15420
15421     _getCreateEventData: function() {
15422         
return {
15423             tab:
this.active,
15424             panel: !
this.active.length ? $() : this._getPanelForTab( this.active )
15425         };
15426     },
15427
15428     _tabKeydown: function(
event ) {
15429         
var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
15430             selectedIndex =
this.tabs.index( focusedTab ),
15431             goingForward =
true;
15432
15433         
if ( this._handlePageNav( event ) ) {
15434             
return;
15435         }
15436
15437         
switch ( event.keyCode ) {
15438             
case $.ui.keyCode.RIGHT:
15439             
case $.ui.keyCode.DOWN:
15440                 selectedIndex++;
15441                 
break;
15442             
case $.ui.keyCode.UP:
15443             
case $.ui.keyCode.LEFT:
15444                 goingForward =
false;
15445                 selectedIndex--;
15446                 
break;
15447             
case $.ui.keyCode.END:
15448                 selectedIndex =
this.anchors.length - 1;
15449                 
break;
15450             
case $.ui.keyCode.HOME:
15451                 selectedIndex =
0;
15452                 
break;
15453             
case $.ui.keyCode.SPACE:
15454                 
// Activate only, no collapsing
15455                 
event.preventDefault();
15456                 clearTimeout(
this.activating );
15457                 
this._activate( selectedIndex );
15458                 
return;
15459             
case $.ui.keyCode.ENTER:
15460                 
// Toggle (cancel delayed activation, allow collapsing)
15461                 
event.preventDefault();
15462                 clearTimeout(
this.activating );
15463                 
// Determine if we should collapse or activate
15464                 
this._activate( selectedIndex === this.options.active ? false : selectedIndex );
15465                 
return;
15466             
default:
15467                 
return;
15468         }
15469
15470         
// Focus the appropriate tab, based on which key was pressed
15471         
event.preventDefault();
15472         clearTimeout(
this.activating );
15473         selectedIndex =
this._focusNextTab( selectedIndex, goingForward );
15474
15475         
// Navigating with control/command key will prevent automatic activation
15476         
if ( !event.ctrlKey && !event.metaKey ) {
15477
15478             
// Update aria-selected immediately so that AT think the tab is already selected.
15479             
// Otherwise AT may confuse the user by stating that they need to activate the tab,
15480             
// but the tab will already be activated by the time the announcement finishes.
15481             focusedTab.attr(
"aria-selected", "false" );
15482             
this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
15483
15484             
this.activating = this._delay(function() {
15485                 
this.option( "active", selectedIndex );
15486             },
this.delay );
15487         }
15488     },
15489
15490     _panelKeydown: function(
event ) {
15491         
if ( this._handlePageNav( event ) ) {
15492             
return;
15493         }
15494
15495         
// Ctrl+up moves focus to the current tab
15496         
if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
15497             
event.preventDefault();
15498             
this.active.focus();
15499         }
15500     },
15501
15502     
// Alt+page up/down moves focus to the previous/next tab (and activates)
15503     _handlePageNav: function(
event ) {
15504         
if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
15505             
this._activate( this._focusNextTab( this.options.active - 1, false ) );
15506             
return true;
15507         }
15508         
if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
15509             
this._activate( this._focusNextTab( this.options.active + 1, true ) );
15510             
return true;
15511         }
15512     },
15513
15514     _findNextTab: function( index, goingForward ) {
15515         
var lastTabIndex = this.tabs.length - 1;
15516
15517         function constrain() {
15518             
if ( index > lastTabIndex ) {
15519                 index =
0;
15520             }
15521             
if ( index < 0 ) {
15522                 index = lastTabIndex;
15523             }
15524             
return index;
15525         }
15526
15527         
while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
15528             index = goingForward ? index +
1 : index - 1;
15529         }
15530
15531         
return index;
15532     },
15533
15534     _focusNextTab: function( index, goingForward ) {
15535         index =
this._findNextTab( index, goingForward );
15536         
this.tabs.eq( index ).focus();
15537         
return index;
15538     },
15539
15540     _setOption: function( key,
value ) {
15541         
if ( key === "active" ) {
15542             
// _activate() will handle invalid values and update this.options
15543             
this._activate( value );
15544             
return;
15545         }
15546
15547         
if ( key === "disabled" ) {
15548             
// don't use the widget factory's disabled handling
15549             
this._setupDisabled( value );
15550             
return;
15551         }
15552
15553         
this._super( key, value);
15554
15555         
if ( key === "collapsible" ) {
15556             
this.element.toggleClass( "ui-tabs-collapsible", value );
15557             
// Setting collapsible: false while collapsed; open first panel
15558             
if ( !value && this.options.active === false ) {
15559                 
this._activate( 0 );
15560             }
15561         }
15562
15563         
if ( key === "event" ) {
15564             
this._setupEvents( value );
15565         }
15566
15567         
if ( key === "heightStyle" ) {
15568             
this._setupHeightStyle( value );
15569         }
15570     },
15571
15572     _sanitizeSelector: function( hash ) {
15573         
return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
15574     },
15575
15576     refresh: function() {
15577         
var options = this.options,
15578             lis =
this.tablist.children( ":has(a[href])" );
15579
15580         
// get disabled tabs from class attribute from HTML
15581         
// this will get converted to a boolean if needed in _refresh()
15582         options.disabled = $.map( lis.filter( "
.ui-state-disabled" ), function( tab ) {
15583             
return lis.index( tab );
15584         });
15585
15586         
this._processTabs();
15587
15588         
// was collapsed or no tabs
15589         
if ( options.active === false || !this.anchors.length ) {
15590             options.active =
false;
15591             
this.active = $();
15592         
// was active, but active tab is gone
15593         }
else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
15594             
// all remaining tabs are disabled
15595             
if ( this.tabs.length === options.disabled.length ) {
15596                 options.active =
false;
15597                 
this.active = $();
15598             
// activate previous tab
15599             }
else {
15600                 
this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
15601             }
15602         
// was active, active tab still exists
15603         }
else {
15604             
// make sure active index is correct
15605             options.active =
this.tabs.index( this.active );
15606         }
15607
15608         
this._refresh();
15609     },
15610
15611     _refresh: function() {
15612         
this._setupDisabled( this.options.disabled );
15613         
this._setupEvents( this.options.event );
15614         
this._setupHeightStyle( this.options.heightStyle );
15615
15616         
this.tabs.not( this.active ).attr({
15617             "
aria-selected": "false",
15618             "
aria-expanded": "false",
15619             tabIndex: -
1
15620         });
15621         
this.panels.not( this._getPanelForTab( this.active ) )
15622             .hide()
15623             .attr({
15624                 "
aria-hidden": "true"
15625             });
15626
15627         
// Make sure one tab is in the tab order
15628         
if ( !this.active.length ) {
15629             
this.tabs.eq( 0 ).attr( "tabIndex", 0 );
15630         }
else {
15631             
this.active
15632                 .addClass( "
ui-tabs-active ui-state-active" )
15633                 .attr({
15634                     "
aria-selected": "true",
15635                     "
aria-expanded": "true",
15636                     tabIndex:
0
15637                 });
15638             
this._getPanelForTab( this.active )
15639                 .show()
15640                 .attr({
15641                     "
aria-hidden": "false"
15642                 });
15643         }
15644     },
15645
15646     _processTabs: function() {
15647         
var that = this,
15648             prevTabs =
this.tabs,
15649             prevAnchors =
this.anchors,
15650             prevPanels =
this.panels;
15651
15652         
this.tablist = this._getList()
15653             .addClass( "
ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
15654             .attr( "
role", "tablist" )
15655
15656             
// Prevent users from focusing disabled tabs via click
15657             .
delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {
15658                 
if ( $( this ).is( ".ui-state-disabled" ) ) {
15659                     
event.preventDefault();
15660                 }
15661             })
15662
15663             
// support: IE <9
15664             
// Preventing the default action in mousedown doesn't prevent IE
15665             
// from focusing the element, so if the anchor gets focused, blur.
15666             
// We don't have to worry about focusing the previously focused
15667             
// element since clicking on a non-focusable element should focus
15668             
// the body anyway.
15669             .
delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
15670                 
if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
15671                     
this.blur();
15672                 }
15673             });
15674
15675         
this.tabs = this.tablist.find( "> li:has(a[href])" )
15676             .addClass( "
ui-state-default ui-corner-top" )
15677             .attr({
15678                 role: "
tab",
15679                 tabIndex: -
1
15680             });
15681
15682         
this.anchors = this.tabs.map(function() {
15683                 
return $( "a", this )[ 0 ];
15684             })
15685             .addClass( "
ui-tabs-anchor" )
15686             .attr({
15687                 role: "
presentation",
15688                 tabIndex: -
1
15689             });
15690
15691         
this.panels = $();
15692
15693         
this.anchors.each(function( i, anchor ) {
15694             
var selector, panel, panelId,
15695                 anchorId = $( anchor ).uniqueId().attr( "
id" ),
15696                 tab = $( anchor ).closest( "
li" ),
15697                 originalAriaControls = tab.attr( "
aria-controls" );
15698
15699             
// inline tab
15700             
if ( that._isLocal( anchor ) ) {
15701                 selector = anchor.hash;
15702                 panelId = selector.substring(
1 );
15703                 panel = that.element.find( that._sanitizeSelector( selector ) );
15704             
// remote tab
15705             }
else {
15706                 
// If the tab doesn't already have aria-controls,
15707                 
// generate an id by using a throw-away element
15708                 panelId = tab.attr( "
aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
15709                 selector = "
#" + panelId;
15710                 panel = that.element.find( selector );
15711                 
if ( !panel.length ) {
15712                     panel = that._createPanel( panelId );
15713                     panel.insertAfter( that.panels[ i -
1 ] || that.tablist );
15714                 }
15715                 panel.attr( "
aria-live", "polite" );
15716             }
15717
15718             
if ( panel.length) {
15719                 that.panels = that.panels.
add( panel );
15720             }
15721             
if ( originalAriaControls ) {
15722                 tab.data( "
ui-tabs-aria-controls", originalAriaControls );
15723             }
15724             tab.attr({
15725                 "
aria-controls": panelId,
15726                 "
aria-labelledby": anchorId
15727             });
15728             panel.attr( "
aria-labelledby", anchorId );
15729         });
15730
15731         
this.panels
15732             .addClass( "
ui-tabs-panel ui-widget-content ui-corner-bottom" )
15733             .attr( "
role", "tabpanel" );
15734
15735         
// Avoid memory leaks (#10056)
15736         
if ( prevTabs ) {
15737             
this._off( prevTabs.not( this.tabs ) );
15738             
this._off( prevAnchors.not( this.anchors ) );
15739             
this._off( prevPanels.not( this.panels ) );
15740         }
15741     },
15742
15743     
// allow overriding how to find the list for rare usage scenarios (#7715)
15744     _getList: function() {
15745         
return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
15746     },
15747
15748     _createPanel: function( id ) {
15749         
return $( "<div>" )
15750             .attr( "
id", id )
15751             .addClass( "
ui-tabs-panel ui-widget-content ui-corner-bottom" )
15752             .data( "
ui-tabs-destroy", true );
15753     },
15754
15755     _setupDisabled: function( disabled ) {
15756         
if ( $.isArray( disabled ) ) {
15757             
if ( !disabled.length ) {
15758                 disabled =
false;
15759             }
else if ( disabled.length === this.anchors.length ) {
15760                 disabled =
true;
15761             }
15762         }
15763
15764         
// disable tabs
15765         
for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
15766             
if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
15767                 $( li )
15768                     .addClass( "
ui-state-disabled" )
15769                     .attr( "
aria-disabled", "true" );
15770             }
else {
15771                 $( li )
15772                     .removeClass( "
ui-state-disabled" )
15773                     .removeAttr( "
aria-disabled" );
15774             }
15775         }
15776
15777         
this.options.disabled = disabled;
15778     },
15779
15780     _setupEvents: function(
event ) {
15781         
var events = {};
15782         
if ( event ) {
15783             $.each(
event.split(" "), function( index, eventName ) {
15784                 events[ eventName ] = "
_eventHandler";
15785             });
15786         }
15787
15788         
this._off( this.anchors.add( this.tabs ).add( this.panels ) );
15789         
// Always prevent the default action, even when disabled
15790         
this._on( true, this.anchors, {
15791             click: function(
event ) {
15792                 
event.preventDefault();
15793             }
15794         });
15795         
this._on( this.anchors, events );
15796         
this._on( this.tabs, { keydown: "_tabKeydown" } );
15797         
this._on( this.panels, { keydown: "_panelKeydown" } );
15798
15799         
this._focusable( this.tabs );
15800         
this._hoverable( this.tabs );
15801     },
15802
15803     _setupHeightStyle: function( heightStyle ) {
15804         
var maxHeight,
15805             parent =
this.element.parent();
15806
15807         
if ( heightStyle === "fill" ) {
15808             maxHeight = parent.height();
15809             maxHeight -=
this.element.outerHeight() - this.element.height();
15810
15811             
this.element.siblings( ":visible" ).each(function() {
15812                 
var elem = $( this ),
15813                     position = elem.css( "
position" );
15814
15815                 
if ( position === "absolute" || position === "fixed" ) {
15816                     
return;
15817                 }
15818                 maxHeight -= elem.outerHeight(
true );
15819             });
15820
15821             
this.element.children().not( this.panels ).each(function() {
15822                 maxHeight -= $(
this ).outerHeight( true );
15823             });
15824
15825             
this.panels.each(function() {
15826                 $(
this ).height( Math.max( 0, maxHeight -
15827                     $(
this ).innerHeight() + $( this ).height() ) );
15828             })
15829             .css( "
overflow", "auto" );
15830         }
else if ( heightStyle === "auto" ) {
15831             maxHeight =
0;
15832             
this.panels.each(function() {
15833                 maxHeight = Math.max( maxHeight, $(
this ).height( "" ).height() );
15834             }).height( maxHeight );
15835         }
15836     },
15837
15838     _eventHandler: function(
event ) {
15839         
var options = this.options,
15840             active =
this.active,
15841             anchor = $(
event.currentTarget ),
15842             tab = anchor.closest( "
li" ),
15843             clickedIsActive = tab[
0 ] === active[ 0 ],
15844             collapsing = clickedIsActive && options.collapsible,
15845             toShow = collapsing ? $() :
this._getPanelForTab( tab ),
15846             toHide = !active.length ? $() :
this._getPanelForTab( active ),
15847             eventData = {
15848                 oldTab: active,
15849                 oldPanel: toHide,
15850                 newTab: collapsing ? $() : tab,
15851                 newPanel: toShow
15852             };
15853
15854         
event.preventDefault();
15855
15856         
if ( tab.hasClass( "ui-state-disabled" ) ||
15857                 
// tab is already loading
15858                 tab.hasClass( "
ui-tabs-loading" ) ||
15859                 
// can't switch durning an animation
15860                 
this.running ||
15861                 
// click on active header, but not collapsible
15862                 ( clickedIsActive && !options.collapsible ) ||
15863                 
// allow canceling activation
15864                 (
this._trigger( "beforeActivate", event, eventData ) === false ) ) {
15865             
return;
15866         }
15867
15868         options.active = collapsing ?
false : this.tabs.index( tab );
15869
15870         
this.active = clickedIsActive ? $() : tab;
15871         
if ( this.xhr ) {
15872             
this.xhr.abort();
15873         }
15874
15875         
if ( !toHide.length && !toShow.length ) {
15876             $.error( "
jQuery UI Tabs: Mismatching fragment identifier." );
15877         }
15878
15879         
if ( toShow.length ) {
15880             
this.load( this.tabs.index( tab ), event );
15881         }
15882         
this._toggle( event, eventData );
15883     },
15884
15885     
// handles show/hide for selecting tabs
15886     _toggle: function(
event, eventData ) {
15887         
var that = this,
15888             toShow = eventData.newPanel,
15889             toHide = eventData.oldPanel;
15890
15891         
this.running = true;
15892
15893         function complete() {
15894             that.running =
false;
15895             that._trigger( "
activate", event, eventData );
15896         }
15897
15898         function show() {
15899             eventData.newTab.closest( "
li" ).addClass( "ui-tabs-active ui-state-active" );
15900
15901             
if ( toShow.length && that.options.show ) {
15902                 that._show( toShow, that.options.show, complete );
15903             }
else {
15904                 toShow.show();
15905                 complete();
15906             }
15907         }
15908
15909         
// start out by hiding, then showing, then completing
15910         
if ( toHide.length && this.options.hide ) {
15911             
this._hide( toHide, this.options.hide, function() {
15912                 eventData.oldTab.closest( "
li" ).removeClass( "ui-tabs-active ui-state-active" );
15913                 show();
15914             });
15915         }
else {
15916             eventData.oldTab.closest( "
li" ).removeClass( "ui-tabs-active ui-state-active" );
15917             toHide.hide();
15918             show();
15919         }
15920
15921         toHide.attr( "
aria-hidden", "true" );
15922         eventData.oldTab.attr({
15923             "
aria-selected": "false",
15924             "
aria-expanded": "false"
15925         });
15926         
// If we're switching tabs, remove the old tab from the tab order.
15927         
// If we're opening from collapsed state, remove the previous tab from the tab order.
15928         
// If we're collapsing, then keep the collapsing tab in the tab order.
15929         
if ( toShow.length && toHide.length ) {
15930             eventData.oldTab.attr( "
tabIndex", -1 );
15931         }
else if ( toShow.length ) {
15932             
this.tabs.filter(function() {
15933                 
return $( this ).attr( "tabIndex" ) === 0;
15934             })
15935             .attr( "
tabIndex", -1 );
15936         }
15937
15938         toShow.attr( "
aria-hidden", "false" );
15939         eventData.newTab.attr({
15940             "
aria-selected": "true",
15941             "
aria-expanded": "true",
15942             tabIndex:
0
15943         });
15944     },
15945
15946     _activate: function( index ) {
15947         
var anchor,
15948             active =
this._findActive( index );
15949
15950         
// trying to activate the already active panel
15951         
if ( active[ 0 ] === this.active[ 0 ] ) {
15952             
return;
15953         }
15954
15955         
// trying to collapse, simulate a click on the current active header
15956         
if ( !active.length ) {
15957             active =
this.active;
15958         }
15959
15960         anchor = active.find( "
.ui-tabs-anchor" )[ 0 ];
15961         
this._eventHandler({
15962             target: anchor,
15963             currentTarget: anchor,
15964             preventDefault: $.noop
15965         });
15966     },
15967
15968     _findActive: function( index ) {
15969         
return index === false ? $() : this.tabs.eq( index );
15970     },
15971
15972     _getIndex: function( index ) {
15973         
// meta-function to give users option to provide a href string instead of a numerical index.
15974         
if ( typeof index === "string" ) {
15975             index =
this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
15976         }
15977
15978         
return index;
15979     },
15980
15981     _destroy: function() {
15982         
if ( this.xhr ) {
15983             
this.xhr.abort();
15984         }
15985
15986         
this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
15987
15988         
this.tablist
15989             .removeClass( "
ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
15990             .removeAttr( "
role" );
15991
15992         
this.anchors
15993             .removeClass( "
ui-tabs-anchor" )
15994             .removeAttr( "
role" )
15995             .removeAttr( "
tabIndex" )
15996             .removeUniqueId();
15997
15998         
this.tablist.unbind( this.eventNamespace );
15999
16000         
this.tabs.add( this.panels ).each(function() {
16001             
if ( $.data( this, "ui-tabs-destroy" ) ) {
16002                 $(
this ).remove();
16003             }
else {
16004                 $(
this )
16005                     .removeClass( "
ui-state-default ui-state-active ui-state-disabled " +
16006                         "
ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
16007                     .removeAttr( "
tabIndex" )
16008                     .removeAttr( "
aria-live" )
16009                     .removeAttr( "
aria-busy" )
16010                     .removeAttr( "
aria-selected" )
16011                     .removeAttr( "
aria-labelledby" )
16012                     .removeAttr( "
aria-hidden" )
16013                     .removeAttr( "
aria-expanded" )
16014                     .removeAttr( "
role" );
16015             }
16016         });
16017
16018         
this.tabs.each(function() {
16019             
var li = $( this ),
16020                 prev = li.data( "
ui-tabs-aria-controls" );
16021             
if ( prev ) {
16022                 li
16023                     .attr( "
aria-controls", prev )
16024                     .removeData( "
ui-tabs-aria-controls" );
16025             }
else {
16026                 li.removeAttr( "
aria-controls" );
16027             }
16028         });
16029
16030         
this.panels.show();
16031
16032         
if ( this.options.heightStyle !== "content" ) {
16033             
this.panels.css( "height", "" );
16034         }
16035     },
16036
16037     enable: function( index ) {
16038         
var disabled = this.options.disabled;
16039         
if ( disabled === false ) {
16040             
return;
16041         }
16042
16043         
if ( index === undefined ) {
16044             disabled =
false;
16045         }
else {
16046             index =
this._getIndex( index );
16047             
if ( $.isArray( disabled ) ) {
16048                 disabled = $.map( disabled, function( num ) {
16049                     
return num !== index ? num : null;
16050                 });
16051             }
else {
16052                 disabled = $.map(
this.tabs, function( li, num ) {
16053                     
return num !== index ? num : null;
16054                 });
16055             }
16056         }
16057         
this._setupDisabled( disabled );
16058     },
16059
16060     disable: function( index ) {
16061         
var disabled = this.options.disabled;
16062         
if ( disabled === true ) {
16063             
return;
16064         }
16065
16066         
if ( index === undefined ) {
16067             disabled =
true;
16068         }
else {
16069             index =
this._getIndex( index );
16070             
if ( $.inArray( index, disabled ) !== -1 ) {
16071                 
return;
16072             }
16073             
if ( $.isArray( disabled ) ) {
16074                 disabled = $.merge( [ index ], disabled ).sort();
16075             }
else {
16076                 disabled = [ index ];
16077             }
16078         }
16079         
this._setupDisabled( disabled );
16080     },
16081
16082     load: function( index,
event ) {
16083         index =
this._getIndex( index );
16084         
var that = this,
16085             tab =
this.tabs.eq( index ),
16086             anchor = tab.find( "
.ui-tabs-anchor" ),
16087             panel =
this._getPanelForTab( tab ),
16088             eventData = {
16089                 tab: tab,
16090                 panel: panel
16091             },
16092             complete = function( jqXHR, status ) {
16093                 
if ( status === "abort" ) {
16094                     that.panels.stop(
false, true );
16095                 }
16096
16097                 tab.removeClass( "
ui-tabs-loading" );
16098                 panel.removeAttr( "
aria-busy" );
16099
16100                 
if ( jqXHR === that.xhr ) {
16101                     delete that.xhr;
16102                 }
16103             };
16104
16105         
// not remote
16106         
if ( this._isLocal( anchor[ 0 ] ) ) {
16107             
return;
16108         }
16109
16110         
this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
16111
16112         
// support: jQuery <1.8
16113         
// jQuery <1.8 returns false if the request is canceled in beforeSend,
16114         
// but as of 1.8, $.ajax() always returns a jqXHR object.
16115         
if ( this.xhr && this.xhr.statusText !== "canceled" ) {
16116             tab.addClass( "
ui-tabs-loading" );
16117             panel.attr( "
aria-busy", "true" );
16118
16119             
this.xhr
16120                 .done(function( response, status, jqXHR ) {
16121                     
// support: jQuery <1.8
16122                     
// http://bugs.jquery.com/ticket/11778
16123                     setTimeout(function() {
16124                         panel.html( response );
16125                         that._trigger( "
load", event, eventData );
16126
16127                         complete( jqXHR, status );
16128                     },
1 );
16129                 })
16130                 .fail(function( jqXHR, status ) {
16131                     
// support: jQuery <1.8
16132                     
// http://bugs.jquery.com/ticket/11778
16133                     setTimeout(function() {
16134                         complete( jqXHR, status );
16135                     },
1 );
16136                 });
16137         }
16138     },
16139
16140     _ajaxSettings: function( anchor,
event, eventData ) {
16141         
var that = this;
16142         
return {
16143             url: anchor.attr( "
href" ),
16144             beforeSend: function( jqXHR, settings ) {
16145                 
return that._trigger( "beforeLoad", event,
16146                     $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
16147             }
16148         };
16149     },
16150
16151     _getPanelForTab: function( tab ) {
16152         
var id = $( tab ).attr( "aria-controls" );
16153         
return this.element.find( this._sanitizeSelector( "#" + id ) );
16154     }
16155 });

16156
16157
16158 /*!
16159  * jQuery UI Tooltip
1.11.4
16160  * http://jqueryui.com
16161  *
16162  * Copyright jQuery Foundation and other contributors
16163  * Released under the MIT license.
16164  * http://jquery.org/license
16165  *
16166  * http://api.jqueryui.com/tooltip/
16167  */

16168
16169
16170 var
tooltip = $.widget( "ui.tooltip", {
16171     version: "
1.11.4",
16172     options: {
16173         content: function() {
16174             
// support: IE<9, Opera in jQuery <1.7
16175             
// .text() can't accept undefined, so coerce to a string
16176             
var title = $( this ).attr( "title" ) || "";
16177             
// Escape title, since we're going from an attribute to raw HTML
16178             
return $( "<a>" ).text( title ).html();
16179         },
16180         hide:
true,
16181         
// Disabled elements have inconsistent behavior across browsers (#8661)
16182         items: "
[title]:not([disabled])",
16183         position: {
16184             my: "
left top+15",
16185             at: "
left bottom",
16186             collision: "
flipfit flip"
16187         },
16188         show:
true,
16189         tooltipClass:
null,
16190         track:
false,
16191
16192         
// callbacks
16193         close:
null,
16194         open:
null
16195     },
16196
16197     _addDescribedBy: function( elem, id ) {
16198         
var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
16199         describedby.push( id );
16200         elem
16201             .data( "
ui-tooltip-id", id )
16202             .attr( "
aria-describedby", $.trim( describedby.join( " " ) ) );
16203     },
16204
16205     _removeDescribedBy: function( elem ) {
16206         
var id = elem.data( "ui-tooltip-id" ),
16207             describedby = (elem.attr( "
aria-describedby" ) || "").split( /\s+/ ),
16208             index = $.inArray( id, describedby );
16209
16210         
if ( index !== -1 ) {
16211             describedby.splice( index,
1 );
16212         }
16213
16214         elem.removeData( "
ui-tooltip-id" );
16215         describedby = $.trim( describedby.
join( " " ) );
16216         
if ( describedby ) {
16217             elem.attr( "
aria-describedby", describedby );
16218         }
else {
16219             elem.removeAttr( "
aria-describedby" );
16220         }
16221     },
16222
16223     _create: function() {
16224         
this._on({
16225             mouseover: "
open",
16226             focusin: "
open"
16227         });
16228
16229         
// IDs of generated tooltips, needed for destroy
16230         
this.tooltips = {};
16231
16232         
// IDs of parent tooltips where we removed the title attribute
16233         
this.parents = {};
16234
16235         
if ( this.options.disabled ) {
16236             
this._disable();
16237         }
16238
16239         
// Append the aria-live region so tooltips announce correctly
16240         
this.liveRegion = $( "<div>" )
16241             .attr({
16242                 role: "
log",
16243                 "
aria-live": "assertive",
16244                 "
aria-relevant": "additions"
16245             })
16246             .addClass( "
ui-helper-hidden-accessible" )
16247             .appendTo(
this.document[ 0 ].body );
16248     },
16249
16250     _setOption: function( key,
value ) {
16251         
var that = this;
16252
16253         
if ( key === "disabled" ) {
16254             
this[ value ? "_disable" : "_enable" ]();
16255             
this.options[ key ] = value;
16256             
// disable element style changes
16257             
return;
16258         }
16259
16260         
this._super( key, value );
16261
16262         
if ( key === "content" ) {
16263             $.each(
this.tooltips, function( id, tooltipData ) {
16264                 that._updateContent( tooltipData.element );
16265             });
16266         }
16267     },
16268
16269     _disable: function() {
16270         
var that = this;
16271
16272         
// close open tooltips
16273         $.each(
this.tooltips, function( id, tooltipData ) {
16274             
var event = $.Event( "blur" );
16275             
event.target = event.currentTarget = tooltipData.element[ 0 ];
16276             that.close(
event, true );
16277         });
16278
16279         
// remove title attributes to prevent native tooltips
16280         
this.element.find( this.options.items ).addBack().each(function() {
16281             
var element = $( this );
16282             
if ( element.is( "[title]" ) ) {
16283                 element
16284                     .data( "
ui-tooltip-title", element.attr( "title" ) )
16285                     .removeAttr( "
title" );
16286             }
16287         });
16288     },
16289
16290     _enable: function() {
16291         
// restore title attributes
16292         
this.element.find( this.options.items ).addBack().each(function() {
16293             
var element = $( this );
16294             
if ( element.data( "ui-tooltip-title" ) ) {
16295                 element.attr( "
title", element.data( "ui-tooltip-title" ) );
16296             }
16297         });
16298     },
16299
16300     open: function(
event ) {
16301         
var that = this,
16302             target = $(
event ? event.target : this.element )
16303                 
// we need closest here due to mouseover bubbling,
16304                 
// but always pointing at the same event target
16305                 .closest(
this.options.items );
16306
16307         
// No element to show a tooltip for or the tooltip is already open
16308         
if ( !target.length || target.data( "ui-tooltip-id" ) ) {
16309             
return;
16310         }
16311
16312         
if ( target.attr( "title" ) ) {
16313             target.data( "
ui-tooltip-title", target.attr( "title" ) );
16314         }
16315
16316         target.data( "
ui-tooltip-open", true );
16317
16318         
// kill parent tooltips, custom or native, for hover
16319         
if ( event && event.type === "mouseover" ) {
16320             target.parents().each(function() {
16321                 
var parent = $( this ),
16322                     blurEvent;
16323                 
if ( parent.data( "ui-tooltip-open" ) ) {
16324                     blurEvent = $.Event( "
blur" );
16325                     blurEvent.target = blurEvent.currentTarget =
this;
16326                     that.close( blurEvent,
true );
16327                 }
16328                 
if ( parent.attr( "title" ) ) {
16329                     parent.uniqueId();
16330                     that.parents[
this.id ] = {
16331                         element:
this,
16332                         title: parent.attr( "
title" )
16333                     };
16334                     parent.attr( "
title", "" );
16335                 }
16336             });
16337         }
16338
16339         
this._registerCloseHandlers( event, target );
16340         
this._updateContent( target, event );
16341     },
16342
16343     _updateContent: function( target,
event ) {
16344         
var content,
16345             contentOption =
this.options.content,
16346             that =
this,
16347             eventType =
event ? event.type : null;
16348
16349         
if ( typeof contentOption === "string" ) {
16350             
return this._open( event, target, contentOption );
16351         }
16352
16353         content = contentOption.call( target[
0], function( response ) {
16354
16355             
// IE may instantly serve a cached response for ajax requests
16356             
// delay this call to _open so the other call to _open runs first
16357             that._delay(function() {
16358
16359                 
// Ignore async response if tooltip was closed already
16360                 
if ( !target.data( "ui-tooltip-open" ) ) {
16361                     
return;
16362                 }
16363
16364                 
// jQuery creates a special event for focusin when it doesn't
16365                 
// exist natively. To improve performance, the native event
16366                 
// object is reused and the type is changed. Therefore, we can't
16367                 
// rely on the type being correct after the event finished
16368                 
// bubbling, so we set it back to the previous value. (#8740)
16369                 
if ( event ) {
16370                     
event.type = eventType;
16371                 }
16372                 
this._open( event, target, response );
16373             });
16374         });
16375         
if ( content ) {
16376             
this._open( event, target, content );
16377         }
16378     },
16379
16380     _open: function(
event, target, content ) {
16381         
var tooltipData, tooltip, delayedShow, a11yContent,
16382             positionOption = $.extend( {},
this.options.position );
16383
16384         
if ( !content ) {
16385             
return;
16386         }
16387
16388         
// Content can be updated multiple times. If the tooltip already
16389         
// exists, then just update the content and bail.
16390         tooltipData =
this._find( target );
16391         
if ( tooltipData ) {
16392             tooltipData.tooltip.find( "
.ui-tooltip-content" ).html( content );
16393             
return;
16394         }
16395
16396         
// if we have a title, clear it to prevent the native tooltip
16397         
// we have to check first to avoid defining a title if none exists
16398         
// (we don't want to cause an element to start matching [title])
16399         
//
16400         
// We use removeAttr only for key events, to allow IE to export the correct
16401         
// accessible attributes. For mouse events, set to empty string to avoid
16402         
// native tooltip showing up (happens only when removing inside mouseover).
16403         
if ( target.is( "[title]" ) ) {
16404             
if ( event && event.type === "mouseover" ) {
16405                 target.attr( "
title", "" );
16406             }
else {
16407                 target.removeAttr( "
title" );
16408             }
16409         }
16410
16411         tooltipData =
this._tooltip( target );
16412         tooltip = tooltipData.tooltip;
16413         
this._addDescribedBy( target, tooltip.attr( "id" ) );
16414         tooltip.find( "
.ui-tooltip-content" ).html( content );
16415
16416         
// Support: Voiceover on OS X, JAWS on IE <= 9
16417         
// JAWS announces deletions even when aria-relevant="additions"
16418         
// Voiceover will sometimes re-read the entire log region's contents from the beginning
16419         
this.liveRegion.children().hide();
16420         
if ( content.clone ) {
16421             a11yContent = content.clone();
16422             a11yContent.removeAttr( "
id" ).find( "[id]" ).removeAttr( "id" );
16423         }
else {
16424             a11yContent = content;
16425         }
16426         $( "
<div>" ).html( a11yContent ).appendTo( this.liveRegion );
16427
16428         function position(
event ) {
16429             positionOption.of =
event;
16430             
if ( tooltip.is( ":hidden" ) ) {
16431                 
return;
16432             }
16433             tooltip.position( positionOption );
16434         }
16435         
if ( this.options.track && event && /^mouse/.test( event.type ) ) {
16436             
this._on( this.document, {
16437                 mousemove: position
16438             });
16439             
// trigger once to override element-relative positioning
16440             position(
event );
16441         }
else {
16442             tooltip.position( $.extend({
16443                 of: target
16444             },
this.options.position ) );
16445         }
16446
16447         tooltip.hide();
16448
16449         
this._show( tooltip, this.options.show );
16450         
// Handle tracking tooltips that are shown with a delay (#8644). As soon
16451         
// as the tooltip is visible, position the tooltip using the most recent
16452         
// event.
16453         
if ( this.options.show && this.options.show.delay ) {
16454             delayedShow =
this.delayedShow = setInterval(function() {
16455                 
if ( tooltip.is( ":visible" ) ) {
16456                     position( positionOption.of );
16457                     clearInterval( delayedShow );
16458                 }
16459             }, $.fx.interval );
16460         }
16461
16462         
this._trigger( "open", event, { tooltip: tooltip } );
16463     },
16464
16465     _registerCloseHandlers: function(
event, target ) {
16466         
var events = {
16467             keyup: function(
event ) {
16468                 
if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
16469                     
var fakeEvent = $.Event(event);
16470                     fakeEvent.currentTarget = target[
0];
16471                     
this.close( fakeEvent, true );
16472                 }
16473             }
16474         };
16475
16476         
// Only bind remove handler for delegated targets. Non-delegated
16477         
// tooltips will handle this in destroy.
16478         
if ( target[ 0 ] !== this.element[ 0 ] ) {
16479             events.
remove = function() {
16480                 
this._removeTooltip( this._find( target ).tooltip );
16481             };
16482         }
16483
16484         
if ( !event || event.type === "mouseover" ) {
16485             events.mouseleave = "
close";
16486         }
16487         
if ( !event || event.type === "focusin" ) {
16488             events.focusout = "
close";
16489         }
16490         
this._on( true, target, events );
16491     },
16492
16493     close: function(
event ) {
16494         
var tooltip,
16495             that =
this,
16496             target = $(
event ? event.currentTarget : this.element ),
16497             tooltipData =
this._find( target );
16498
16499         
// The tooltip may already be closed
16500         
if ( !tooltipData ) {
16501
16502             
// We set ui-tooltip-open immediately upon open (in open()), but only set the
16503             
// additional data once there's actually content to show (in _open()). So even if the
16504             
// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
16505             
// the period between open() and _open().
16506             target.removeData( "
ui-tooltip-open" );
16507             
return;
16508         }
16509
16510         tooltip = tooltipData.tooltip;
16511
16512         
// disabling closes the tooltip, so we need to track when we're closing
16513         
// to avoid an infinite loop in case the tooltip becomes disabled on close
16514         
if ( tooltipData.closing ) {
16515             
return;
16516         }
16517
16518         
// Clear the interval for delayed tracking tooltips
16519         clearInterval(
this.delayedShow );
16520
16521         
// only set title if we had one before (see comment in _open())
16522         
// If the title attribute has changed since open(), don't restore
16523         
if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
16524             target.attr( "
title", target.data( "ui-tooltip-title" ) );
16525         }
16526
16527         
this._removeDescribedBy( target );
16528
16529         tooltipData.hiding =
true;
16530         tooltip.stop(
true );
16531         
this._hide( tooltip, this.options.hide, function() {
16532             that._removeTooltip( $(
this ) );
16533         });
16534
16535         target.removeData( "
ui-tooltip-open" );
16536         
this._off( target, "mouseleave focusout keyup" );
16537
16538         
// Remove 'remove' binding only on delegated targets
16539         
if ( target[ 0 ] !== this.element[ 0 ] ) {
16540             
this._off( target, "remove" );
16541         }
16542         
this._off( this.document, "mousemove" );
16543
16544         
if ( event && event.type === "mouseleave" ) {
16545             $.each(
this.parents, function( id, parent ) {
16546                 $( parent.element ).attr( "
title", parent.title );
16547                 delete that.parents[ id ];
16548             });
16549         }
16550
16551         tooltipData.closing =
true;
16552         
this._trigger( "close", event, { tooltip: tooltip } );
16553         
if ( !tooltipData.hiding ) {
16554             tooltipData.closing =
false;
16555         }
16556     },
16557
16558     _tooltip: function( element ) {
16559         
var tooltip = $( "<div>" )
16560                 .attr( "
role", "tooltip" )
16561                 .addClass( "
ui-tooltip ui-widget ui-corner-all ui-widget-content " +
16562                     (
this.options.tooltipClass || "" ) ),
16563             id = tooltip.uniqueId().attr( "
id" );
16564
16565         $( "
<div>" )
16566             .addClass( "
ui-tooltip-content" )
16567             .appendTo( tooltip );
16568
16569         tooltip.appendTo(
this.document[0].body );
16570
16571         
return this.tooltips[ id ] = {
16572             element: element,
16573             tooltip: tooltip
16574         };
16575     },
16576
16577     _find: function( target ) {
16578         
var id = target.data( "ui-tooltip-id" );
16579         
return id ? this.tooltips[ id ] : null;
16580     },
16581
16582     _removeTooltip: function( tooltip ) {
16583         tooltip.
remove();
16584         delete
this.tooltips[ tooltip.attr( "id" ) ];
16585     },
16586
16587     _destroy: function() {
16588         
var that = this;
16589
16590         
// close open tooltips
16591         $.each(
this.tooltips, function( id, tooltipData ) {
16592             
// Delegate to close method to handle common cleanup
16593             
var event = $.Event( "blur" ),
16594                 element = tooltipData.element;
16595             
event.target = event.currentTarget = element[ 0 ];
16596             that.close(
event, true );
16597
16598             
// Remove immediately; destroying an open tooltip doesn't use the
16599             
// hide animation
16600             $( "
#" + id ).remove();
16601
16602             
// Restore the title
16603             
if ( element.data( "ui-tooltip-title" ) ) {
16604                 
// If the title attribute has changed since open(), don't restore
16605                 
if ( !element.attr( "title" ) ) {
16606                     element.attr( "
title", element.data( "ui-tooltip-title" ) );
16607                 }
16608                 element.removeData( "
ui-tooltip-title" );
16609             }
16610         });
16611         
this.liveRegion.remove();
16612     }
16613 });
16614
16615
16616
16617 }));



Full source code website bán hàng thương mại điện tử gần giống shopee 469.177 lượt xem

Gõ tìm kiếm nhanh...